2009-07-31 29 views
11

Cụ thể, tôi có hai danh sách các chuỗi mà tôi muốn kết hợp thành một chuỗi trong đó mỗi dòng là hai chuỗi kế tiếp từ danh sách, cách nhau bằng dấu cách:Làm cách nào để lặp qua các bộ mục của hai hoặc nhiều danh sách bằng Python?

a = ['foo1', 'foo2', 'foo3'] 
b = ['bar1', 'bar2', 'bar3'] 

Tôi muốn có một chức năng combine_to_lines() sẽ trả lại:

"""foo1 bar1 
foo2 bar2 
foo3 bar3""" 

Tôi thừa nhận tôi đã giải quyết vấn đề này, vì vậy tôi sẽ đăng câu trả lời. Nhưng có lẽ một người khác có một cái tốt hơn hoặc nhìn thấy một lỗ hổng trong tôi.

Cập nhật: Tôi đã đơn giản hóa ví dụ trên. Trong vấn đề thực tế của tôi, các dòng được định dạng theo cách phức tạp hơn, yêu cầu các bộ dữ liệu trả về từ zip() sẽ được giải nén. Nhưng kudo đến mhawke để tìm ra giải pháp đơn giản nhất cho ví dụ này.

Trả lời

14

Đó không phải là cần thiết để giải nén và đóng gói lại các tuples trả về bởi zip:

'\n'.join(' '.join(x) for x in zip(a, b)) 
1

Bạn có hỏi về chức năng zip không?

+1

Vâng. Tôi không thể nhớ nó, và tìm kiếm của Google mất một chút thời gian để chạy bộ nhớ của tôi. Có lẽ câu hỏi này sẽ xuất hiện trong các tìm kiếm trong tương lai. –

+0

, và giúp tôi chạy bộ nhớ. cảm ơn. – aeroNotAuto

+0

Một câu hỏi khác là câu trả lời cho câu hỏi? :) –

9

zip function "trả về danh sách các bộ dữ liệu, nơi bộ t thứ i chứa phần tử thứ i từ mỗi chuỗi đối số hoặc vòng lặp."

def combine_to_lines(list1, list2): 
    return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)]) 
7
>>> a = ['foo1', 'foo2', 'foo3'] 
>>> b = ['bar1', 'bar2', 'bar3'] 
>>> for i in zip(a,b): 
... print ' '.join(i) 
... 
foo1 bar1 
foo2 bar2 
foo3 bar3 
0

Dưới đây là một lớp lót. Có thể làm x + ' ' + y nếu bạn nghiêng quá, không chắc liệu nó có chậm hơn hay không.

>>> a = ['foo1', 'foo2' , 'foo3'] 
>>> b = ['bar1', 'bar2', 'bar3'] 
>>> '\n'.join(' '.join([x,y]) for (x,y) in zip(a,b)) 
'foo1 bar1\nfoo2 bar2\nfoo3 bar3' 
>>> print _ 
foo1 bar1 
foo2 bar2 
foo3 bar3 
0
'\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b))) 
0

đơn giản như:

+0

các dòng mới ở đâu? – mhawke

1

Tôi nhận ra đây là một câu hỏi rất cũ, nhưng nó là thú vị để lưu ý rằng điều này có thể được xem như là một matrix transposition.

>>> import numpy 
>>> data = numpy.array([['foo1','foo2','foo3'],['bar1','bar2','bar3']]) 
>>> print(data) 
[['foo1' 'foo2' 'foo3'] 
['bar1' 'bar2' 'bar3']] 
>>> print(data.transpose()) 
[['foo1' 'bar1'] 
['foo2' 'bar2'] 
['foo3' 'bar3']] 

Nếu bạn đang xử lý một tập dữ liệu lớn hoặc nhiều danh sách hơn, đây có thể là giải pháp hiệu quả hơn.

0

Trong python 3.x:

'\n'.join(' '.join(x) for x in zip(a, b)) 

zip trả về một danh sách các hàng. zip dừng khi ngắn hơn của a hoặc b dừng lại.

Trong python 2.x:

nếu itertools.izip sẽ dừng lại khi một trong những danh sách chạy ra khỏi các yếu tố nhưng itertools.izip_longest sẽ ngừng cho đến khi danh sách không có bất kỳ yếu tố hơn

import itertools 
'\n'.join(' '.join(x) for x in itertools.izip(a, b)) 

'\n'.join(' '.join(x) for x in itertools.izip_longest(a, b)) 
+0

cũng ghi có cho mhawke để tìm ra giải pháp chính –

+0

Tại sao bạn viết "In Python 3.x" ở trên? Tôi chỉ xác nhận rằng zip dừng lại khi ngắn hơn của a hoặc b dừng lại trên Python 2.7.5. –

+0

bạn nói đúng! từ những gì tôi hiểu đây không phải là một tính năng trong python 2.x trước đó và nó đã được chuyển trở lại từ 3.x tôi phải không? nếu như vậy từ phiên bản nào tôi đã được cập nhật? –

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