2016-08-30 3 views

Odpowiedz

3

Nie wiem, czy jest to najlepszy sposób, ale chciałbym zrobić:

l = [1, 5, 7] 
print([y for x in l for y in (x, x + 1)]) 

Innym sposobem korzystania itertools.chain.from_iterable:

from itertools import chain 
l = [1, 5, 7] 
print(list(chain.from_iterable((x, x + 1) for x in l))) 
1

można zrobić swoją listę logikę rozumienia ze krotki a następnie spłaszczyć wynikowy listę:

[n for pair in [(x, x+1) for x in [1,5,7]] for n in pair]

0

Jeśli chcesz wypełnić listę liczbami od wartości min do max + 1, możesz użyć [i for i in range (min(x),max(x)+2)], zakładając, że x jest twoją listą.

+0

Nie sądzę, że to właśnie próbują osiągnąć. – 101

2

I zawsze można overcomplicate problem z operator, imap(), partial(), izip() i chain():

>>> from itertools import chain, izip, imap 
>>> from operator import add 
>>> from functools import partial 
>>> 
>>> l = [1, 5, 7] 
>>> 
>>> list(chain(*izip(l, imap(partial(add, 1), l)))) 
[1, 2, 5, 6, 7, 8] 

Co się dzieje tutaj:

  • wykonujemy iterator nad l które odnoszą się add function z 1 jako argument
  • spakowaliśmy początkowy l ist z iteratora zwróconego przez imap() do wytworzenia pary x, x + 1 wartości
  • my flatten the list with chain() i przekonwertować go na liście, aby zobaczyć wynik
+3

Haha, to jest ohydne;) – 101

+0

Tak, nie rozumiem tego co robię. Jest to działające rozwiązanie * z wyjaśnieniem *, linki do dokumentów i nawet mówi, że rozumiem, że jest to nadmierna komplikacja. – alecxe

+1

Bije mnie, przegłosowałem to. – 101

2

prosty sposób myślenia o problemie to zrobić druga lista zwiększonymi wartościami i dodać go do pierwotnej listy, a następnie posortować je:

l = [1, 5, 7] 
m = l + [i+1 for i in l] 
m.sort() 
print m # [1, 2, 5, 6, 7, 8] 
2

można łączyć kilka pomysłów z odpowiedzi alecxe i co już mieliśmy:

>>> import itertools 
>>> 
>>> a = [1, 5, 7] 
>>> b = ((x, x+1) for x in a) 
>>> 
>>> list(itertools.chain(*b)) 
[1, 2, 5, 6, 7, 8] 

Co mam zrobić to:

  1. Zdefiniuj w bgenerator expression co pozwala nam mieć (coś, co wygląda jak) krotki, które nie wyglądały jak ((1, 2), (5, 6), (7, 8)) ale bez oceniania go od razu. Miałoby to również działać ze zrozumieniem listy.

  2. Unpack b in the argument list z itertools.chain(). Byłby to odpowiednik itertools.chain((1, 2), (5, 6), (7, 8)). Ta funkcja łączy swoje argumenty.

  3. Użyj listy(), aby utworzyć listę z wartości zwracanej funkcji itertools.chain(), ponieważ jest to iterator.

Można również pracował bez etapu pośredniego:

>>> import itertools 
>>> list(itertools.chain(*((x, x+1) for x in [1, 5, 7]))) 
[1, 2, 5, 6, 7, 8] 

Ale "Proste jest lepsze niż kompleks"

mam nadzieję, że to pomaga.

Dodałbym więcej linków, gdybym miał więcej reputacji, przepraszam.

2

Utwórz funkcję generatora, która będzie iterować nad listą i z kolei otrzyma każdy element i ten element plus jeden. Iteruj nad swoim generatorem.

def foo(lyst): 
    for element in lyst: 
     yield element 
     yield element + 1 

>>> print(list(foo([1, 5, 7]))) 
[1, 2, 5, 6, 7, 8] 
>>> 
>>> print([element for element in foo([1, 5, 7])]) 
[1, 2, 5, 6, 7, 8] 
>>> 
Powiązane problemy