2013-09-24 11 views
8

Mam dwie listy i chcę je połączyć w jedną listę tuples. Chcę to zrobić z list comprehension, mogę go uruchomić przy użyciu map. ale byłoby miło wiedzieć, jak będzie działało rozumienie listy. kod tutajJak zdobyć krotek z list za pomocą zrozumienia list w python

>>> lst = [1,2,3,4,5] 
>>> lst2 = [6,7,8,9,10] 
>>> tup = map(None,lst,lst2) # works fine 
>>> tup 
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 
>>> l3 = [lst, lst2] 
>>> l3 
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] 
>>> zip(*l3) # works fine 
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 

>>> [(i,j) for i in lst and for j in lst2] # does not work 
    File "<stdin>", line 1 
    [(i,j) for i in lst and for j in lst2] 
          ^
SyntaxError: invalid syntax 
>>> 

Pisałem komentarzy, gdzie pracuje i gdzie nie. Jak można dwa for-loop być połączone w list comprehension

Odpowiedz

13

Wyobraź sobie listę jako pętle. Jak napisać 2 nie zagnieżdżone pętle?

Można to zrobić z nieco wierd listowego:

[(x, lst2[i]) for i, x in enumerate(lst)] 

lub

[(lst[i], lst2[i]) for i in xrange(len(lst))] 

Ale faktycznie, to lepiej użyć zip.

+1

fajne rozwiązanie, zastanawiałem się, czy i jak uzyskać dwa do pętli w spisie zrozumienie – eagertoLearn

5

Lista rozumienie sposobem jest głupie, bo to po prostu owija się nie robić nic listowych wokół zip:

[(i,j) for i, j in zip(lst, lst2)] 

wystarczy użyć zip, to co to za. Nie ma sensu zmuszać się do korzystania ze zrozumień listowych, gdy nic nie osiągają.

Edycja: Jeśli twoje pytanie brzmi "jak uzyskać dwie pętle w jednym zrozumieniu listy", powinieneś zapytać o to. Odpowiedź brzmi "Nie można uzyskać dwóch pętli PARALLEL for w jednym zrozumieniu listy". Za każdym razem, gdy umieścisz dwie klauzule for w zrozumieniu listy, zostaną one zagnieżdżone. Że lista zrozumieniem tak:

[... for a in list1 for b in list2] 

działa jak dwie pętle zagnieżdżone for:

for a in list1: 
    for b in list2: 
     ... 

Nie można pisać listy ze zrozumieniem, które wykonuje to:

for a in list1: 
    ... 
for b in list2: 
    ... 

. . . i nie musisz tego robić, ponieważ zamiast tego masz funkcję zip.

(można sortować fałszywych nim przy użyciu roztworu jak @Roman Pekar, ale to naprawdę nie zrobić dwie pętle for;. To właśnie robi jeden i używa wartości od tamtego dotarcia do innej listy)

+0

Jest to równoważne użyciu zip (lst, lst2). Nie ma potrzeby [(i, j) w przypadku i, j w zip (lst, lst2)] >>> 'zip (lst, lst2) [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] >>> [(i, j) dla i, j w suwaku (1st, lst2)] [(1, 6), (2, 7) , (3, 8), (4, 9), (5, 10)] 'Chciałbym osiągnąć to bez użycia' zip'if possible – eagertoLearn

+0

@ user2708477 dlaczego nie chcesz używać zip? –

+0

@RomanPekar: jak moje pytanie mówi, że chcę używać rozumienia list, po prostu dlatego, że chcę zobaczyć, jak uzyskać dwie pętle for w rozumieniu ze zrozumieniem list, wiem, jak działa zip i jest całkiem prosty w użyciu z suwakiem – eagertoLearn

Powiązane problemy