2010-03-09 48 views

Trả lời

258
>>> list_a = [1, 2, 3, 4] 
>>> list_b = [5, 6, 7, 8] 
>>> zip(list_a, list_b) 
[(1, 5), (2, 6), (3, 7), (4, 8)] 
+56

bạn phải biết rằng chức năng zip dừng lại ở cuối danh sách ngắn nhất, mà có thể không luôn luôn những gì bạn muốn . mô-đun 'itertools' định nghĩa phương thức' zip_longest() 'dừng ở cuối danh sách dài nhất, lấp đầy các giá trị thiếu với thứ bạn cung cấp làm tham số. –

+5

@Adrien: chúc mừng nhận xét thích hợp của bạn. Đối với Python 2.x, 's/zip_longest()/izip_longest()'. Đổi tên thành Python 3.x thành 'zip_longest()'. – bernie

+0

Tôi có thể tạo [(1,5), (1,6), (1,7), (1,8), (2,5), (2,6), vv ..] bằng lệnh zip không? –

87

Trong python 3.0 zip trả về đối tượng zip. Bạn có thể nhận được một danh sách ra khỏi nó bằng cách gọi list(zip(a, b)).

3

Tôi biết đây là câu hỏi cũ và đã được trả lời, nhưng vì một lý do nào đó, tôi vẫn muốn đăng giải pháp thay thế này. Tôi biết thật dễ dàng để chỉ cần tìm ra chức năng tích hợp nào có "ma thuật" mà bạn cần, nhưng nó không làm tổn thương khi biết bạn có thể tự mình làm điều đó.

>>> list_1 = ['Ace', 'King'] 
>>> list_2 = ['Spades', 'Clubs', 'Diamonds'] 
>>> deck = [] 
>>> for i in range(max((len(list_1),len(list_2)))): 
     while True: 
      try: 
       card = (list_1[i],list_2[i]) 
      except IndexError: 
       if len(list_1)>len(list_2): 
        list_2.append('') 
        card = (list_1[i],list_2[i]) 
       elif len(list_1)<len(list_2): 
        list_1.append('') 
        card = (list_1[i], list_2[i]) 
       continue 
      deck.append(card) 
      break 
>>> 
>>> #and the result should be: 
>>> print deck 
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')] 
+2

Thay đổi một trong các danh sách đầu vào (nếu chúng khác nhau về chiều dài) không phải là một hiệu ứng phụ tốt đẹp. Ngoài ra, hai bài tập cho 'thẻ' trong' if-elif' là không cần thiết, đó là lý do tại sao bạn có 'tiếp tục'. (Thực tế, nếu không có 'tiếp tục', bạn sẽ không phải thay đổi danh sách: cả hai bài tập được đề cập trước đó nên được lưu giữ và trở thành' thẻ = (danh sách_1 [i], '') 'và' thẻ = ('', list_2 [1]) 'tương ứng.) –

6

Bạn có thể sử dụng bản đồ lambda

a = [2,3,4] 
b = [5,6,7] 
c = map(lambda x,y:(x,y),a,b) 

này cũng sẽ làm việc nếu có độ dài của danh sách ban đầu không phù hợp

+1

Tại sao sử dụng lambda? 'map (None, a, b)' –

+0

Không có lỗi nào sẽ phát ra lỗi vì nó không thể gọi được. –

+0

Bạn đã thử chưa? –

4

Sản lượng mà bạn thấy trong báo cáo vấn đề không phải là tuple nhưng danh sách

list_c = [(1,5), (2,6), (3,7), (4,8)] 

kiểm tra

type(list_c) 

xem xét bạn muốn kết quả như tuple ra khỏi list_a và list_b, làm

tuple(zip(list_a,list_b)) 
+0

Từ quan điểm của tôi, nó có vẻ là những gì tôi đang tìm kiếm và làm việc tốt cho cả hai (danh sách và tuple). Bởi vì khi bạn sử dụng ** in **, bạn sẽ thấy giá trị đúng (như mong đợi và được đề cập bởi @cyborg và @Lodewijk) và không có gì liên quan đến đối tượng ** ** như: '<đối tượng bản đồ tại 0x000001F266DCE5C0>' hoặc '<đối tượng zip tại 0x000002629D204C88>'.Ít nhất, giải pháp về ** bản đồ ** và ** zip ** (một mình) dường như không đầy đủ (hoặc quá phức tạp) đối với tôi. –

Các vấn đề liên quan