2010-08-12 37 views
22

Tôi cóLàm cách nào để hợp nhất hai danh sách vào một danh sách?

a = [1, 2] 
b = ['a', 'b'] 

Tôi muốn

c = [1, 'a', 2, 'b'] 
+1

@ câu trả lời cdleary của http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python/408281 # 408281 cung cấp so sánh hiệu suất cho nhiều cách khác nhau để "Làm phẳng danh sách nông trong python" (làm phẳng 'zip (a, b)' cung cấp cho bạn câu trả lời). – jfs

Trả lời

44
[j for i in zip(a,b) for j in i] 
+24

Nó hoạt động, nhưng tôi không thể phân tích nó trong đầu của tôi ... –

+4

[j cho j trong i cho tôi trong zip (a, b)] mặc dù dễ dàng hơn để phân tích cú pháp trong đầu của tôi không hoạt động! – sureshvv

+18

Lần đầu tiên đọc một cách kỳ lạ :) Cố ý cắt bỏ mọi thứ lên đến 'for' đầu tiên và di chuyển nó đến cuối, sau đó đọc:' for i in zip (a, b) ',' cho j trong i', ' j'. – shambulator

24

Nếu thứ tự của các yếu tố nhiều phù hợp với trật tự trong ví dụ của bạn thì bạn có thể sử dụng một sự kết hợp của zipchain:

from itertools import chain 
c = list(chain(*zip(a,b))) 

Nếu bạn không quan tâm đến thứ tự của các yếu tố trong kết quả của bạn thì có một cách đơn giản hơn:

c = a + b 
+1

sử dụng điều này trong trường hợp của tôi: 'c = a + b' -> danh sách không thể lặp lại. Vậy thì sao? Chỉ các công trình chuỗi kiểm tra câu hỏi của tôi mới hiểu được vấn đề của tôi: 'http: // stackoverflow.com/questions/40952892/extract-url-tên-của-an-html-tệp-được lưu trữ-trên-đĩa-và-in-chúng-tôn trọng ' –

+0

cho chỉ mục, hàng trong datas.iterrows(): textF = re.findall ('? {{f}} (*)}}', chèo [ 'xem xét']) matrixF + = textF nếu index == 3: nghỉ cho chỉ mục trong matrixF: chỉ số in , nó vẫn hoạt động, vì vậy nó vẫn lặp tôi nghĩ? ._. –

+0

Có [chain.from_iterable] (https://docs.python.org/3/library/itertools.html#itertools.chain.from_iterable): 'list (chain.from_iterable (zip (a, b)))' - hoàn toàn lười biếng cách để làm điều này. – byashimov

4

Nếu bạn quan tâm đến thứ tự:

#import operator 
import itertools 
a = [1,2] 
b = ['a','b'] 
#c = list(reduce(operator.add,zip(a,b))) # slow. 
c = list(itertools.chain.from_iterable(zip(a,b))) # better. 

print c cho [1, 'a', 2, 'b']

+0

-1 cho thời gian bậc hai. Bạn có thể làm điều này trong thời gian tuyến tính. – habnabit

+0

@Aaron Gallagher Đã sửa lỗi và chưa có câu trả lời duy nhất (phụ). –

21

Parsing

[j for i in zip(a,b) for j in i] 

trong đầu của bạn là đủ dễ dàng nếu bạn nhớ lại rằng forif khoản được thực hiện theo thứ tự, theo một append cuối cùng của kết quả:

temp = [] 
for i in zip(a, b): 
    for j in i: 
     temp.append(j) 

và sẽ dễ dàng hơn đã nó đã được viết với tên biến có ý nghĩa hơn:

[item for pair in zip(a, b) for item in pair] 
+0

Tôi thường rất thoải mái với LE, nhưng vòng lặp đôi này khiến tôi bối rối. Cảm ơn lời giải thích tốt đẹp. –

5

Một phương pháp thay thế sử dụng cắt chỉ mục hóa ra nhanh hơn và cân tốt hơn zip:

def slicezip(a, b): 
    result = [0]*(len(a)+len(b)) 
    result[::2] = a 
    result[1::2] = b 
    return result 

Bạn sẽ nhận thấy rằng điều này chỉ hoạt động nếu len(a) == len(b) nhưng pu điều kiện tting để mô phỏng zip sẽ không mở rộng với a hoặc b.

Để so sánh:

a = range(100) 
b = range(100) 

%timeit [j for i in zip(a,b) for j in i] 
100000 loops, best of 3: 15.4 µs per loop 

%timeit list(chain(*zip(a,b))) 
100000 loops, best of 3: 11.9 µs per loop 

%timeit slicezip(a,b) 
100000 loops, best of 3: 2.76 µs per loop 
+0

ý bạn là gì khi "đặt điều kiện để mô phỏng zip sẽ không mở rộng bằng a hoặc b"? – sureshvv

+0

Tôi chỉ đơn giản có nghĩa là với zip, nếu một danh sách dài hơn danh sách kia, danh sách dài hơn sẽ bị cắt bớt để hợp nhất nó với danh sách ngắn hơn. Người ta có thể làm điều này bằng cách so sánh độ dài của mỗi mảng và sau đó chỉ gán một phiên bản rút gọn của một mảng dài hơn. Việc kiểm tra độ dài và cắt ngắn này không mất nhiều thời gian hơn nếu các mảng trở nên lớn hơn. – SeanM

+0

Lưu ý: Điều này hoạt động tốt cho các mục đích chia sẻ có lợi cho danh sách đầu tiên: nó chịu được cùng độ dài hoặc dài hơn 'slicezip thứ hai ([1,2,3], [4,5])', có nghĩa là bạn không 't có để xử lý danh sách không đồng đều trong trường hợp đó (mà là rất tốt đẹp) – TemporalWolf

0
def main(): 

drinks = ["Johnnie Walker", "Jose Cuervo", "Jim Beam", "Jack Daniels,"] 
booze = [1, 2, 3, 4, 5] 
num_drinks = [] 
x = 0 
for i in booze: 

    if x < len(drinks): 

     num_drinks.append(drinks[x]) 
     num_drinks.append(booze[x]) 

     x += 1 

    else: 

     print(num_drinks) 

return 

chính()

+1

Xin vui lòng bạn phải giải thích câu trả lời của bạn. –

+0

Bạn có nghĩ ra câu trả lời này sau 5 vòng không? – sureshvv

-2
c = [] 
c.extend(a) 
c.extend(b) 
+1

Kết quả mong muốn hoàn toàn khác. – vaultah

+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về cách thức và/hoặc lý do giải thích vấn đề này sẽ cải thiện giá trị lâu dài của câu trả lời. –

+0

nếu nó trả lời câu hỏi và khác với tất cả các câu trả lời khác, tại sao không hỗ trợ nó? tôi tin rằng không có nhiều bối cảnh cho các câu hỏi để bất kỳ câu trả lời có liên quan được chào đón. –

0

Dưới đây là một tiêu chuẩn/tự giải thích giải pháp, tôi hy vọng ai đó sẽ tìm thấy nó hữu ích:

a = ['a', 'b', 'c'] 
b = ['1', '2', '3'] 

c = [] 
for x, y in zip(a, b): 
    c.append(x) 
    c.append(y) 

print (c) 

đầu ra:

['a', '1', 'b', '2', 'c', '3'] 

Tất nhiên, bạn có thể thay đổi nó và làm thao tác trên các giá trị nếu cần thiết

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