2013-09-24 97 views
8

Tôi có hai danh sách và muốn kết hợp chúng thành một danh sách tuples. Tôi muốn làm điều đó với list comprehension, tôi có thể làm cho nó hoạt động bằng cách sử dụng map. nhưng sẽ rất tuyệt khi biết cách hiểu danh sách ở đây sẽ hiệu quả. mã tại đâycách lấy các bộ từ danh sách bằng cách sử dụng tính năng hiểu danh sách trong 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 
>>> 

Tôi đã viết nhận xét nơi nó hoạt động và vị trí không hoạt động. Làm thế nào một hai for-loop có thể được kết hợp trong list comprehension

Trả lời

13

Suy nghĩ về việc hiểu danh sách dưới dạng vòng lặp. Làm thế nào bạn có thể viết 2 vòng không lồng nhau?

Bạn có thể làm điều này với danh sách hiểu hơi lạ:

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

hoặc

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

Nhưng trên thực tế, nó là tốt hơn để sử dụng zip.

+1

giải pháp tốt đẹp, tôi đã tự hỏi nếu và làm thế nào để có được hai cho vòng bên trong danh sách hiểu – eagertoLearn

5

Danh sách hiểu cách là ngớ ngẩn, bởi vì nó chỉ kết thúc tốt đẹp một danh sách hiểu làm-gì xung quanh zip:

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

Chỉ cần sử dụng zip, đây là những gì nó cho. Không có ý nghĩa trong việc buộc bản thân bạn phải sử dụng tính năng hiểu danh sách khi chúng không thực hiện bất kỳ điều gì.

Chỉnh sửa: Nếu câu hỏi của bạn là "làm cách nào để tôi nhận được hai vòng lặp trong một lần đọc danh sách", bạn nên yêu cầu thay thế. Câu trả lời là "Bạn không thể nhận được hai PARALLEL for vòng trong một danh sách hiểu". Bất cứ lúc nào bạn đặt hai mệnh đề for vào danh sách hiểu, chúng sẽ được lồng nhau. Đó là, một danh sách hiểu như thế này:

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

trình giống như hai lồng nhau for vòng:

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

Bạn không thể viết một sự hiểu biết danh sách đó thực hiện điều này:

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

. . . và bạn không cần, bởi vì bạn có chức năng zip để làm điều đó thay thế.

(Bạn có thể giả mạo nó bằng cách sử dụng một giải pháp như @Roman Pekar's, nhưng điều đó không thực sự làm hai vòng for; nó chỉ làm một và sử dụng các giá trị từ đó để truy cập vào danh sách khác.)

+0

Điều này tương đương với việc sử dụng mã zip (lst, lst2). Không cần [(i, j) cho i, j trong zip (lst, lst2)] >>> 'zip (lst, lst2) [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] >>> [(i, j) cho i, j trong zip (lst, lst2)] [(1, 6), (2, 7) , (3, 8), (4, 9), (5, 10)] 'Tôi muốn đạt được điều này mà không sử dụng' zip'if có thể – eagertoLearn

+0

@ user2708477 tại sao bạn không muốn sử dụng zip? –

+0

@RomanPekar: như câu hỏi của tôi nói rằng tôi muốn sử dụng danh sách hiểu, đơn giản vì tôi muốn xem làm thế nào để có được hai vòng lặp trong danh sách hiểu, tôi biết làm thế nào zip hoạt động mặc dù và nó là khá đơn giản để sử dụng với zip – eagertoLearn