Đối với người mới bắt đầu, zip
mang lại tuples, không danh sách, vì vậy bạn sẽ phải chuyển đổi sản lượng của nó vào danh sách:
def lzip(*args):
'Transforms the tuples yielded by zip into equivalent lists.'
for tup in zip(*args):
yield list(tup)
return
# Later...
a = [1, 2, 3]
b = [4, 5, 6]
c = [
[7, 8],
[9, 10],
[11, 12],
]
lzip(a, b)
# A generator that yields: [1, 4], [2, 5], [3, 6]
Se cond, zip
sẽ không trả về những gì bạn muốn bất kể điều gì, bởi vì thao tác bạn đang cố gắng thực hiện trên danh sách phụ của c
là ghép nối, không nén.
Đầu tiên, lzip
danh sách 1-d như trong ví dụ ở trên, sau đó ghép từng danh sách phụ kết quả với danh sách con phù hợp trong c
.
Dưới đây, tôi đã sử dụng một danh sách hiểu để xây dựng danh sách kết hợp gán nó vào một biến, với hai biến cục bộ mới để làm cho hoạt động zip
rõ ràng hơn:
heads = lzip(a, b)
tails = c
zipped = [head + tail for head, tail in zip(heads, tails)]
# [[1, 4, 7, 8], [2, 5, 9, 10], [3, 6, 11, 12]]
Các zip
sản lượng 2-tuples chứa n & # x2060; đầu thứ và n & # x2060; đuôi thứ:
# First iteration:
([1, 4], [7, 8])
# Next iteration:
([2, 5], [9, 10])
# Last iteration:
([3, 6], [11, 12])
những tuples được giải nén vào hai va riables bởi việc phân công (vô hình) head, tail = ...
bên trong danh sách hiểu. Bản thân các tuple được vứt bỏ.
Kết hợp danh sách ("thêm") với head + tail
kết hợp hai danh sách thành một. Trong trường hợp này, các cặp danh sách 2 phần tử trở thành các danh sách 4 phần tử riêng lẻ.
Cuối cùng, [
và ]
của danh sách hiểu được thu thập danh sách 4 phần tử thành một danh sách ... trong danh sách 4 phần tử.
Điều này làm việc tốt cho trường hợp đơn giản, nhưng không mở rộng hoặc thích ứng tốt với các thay đổi. Nếu mảng c chứa một số lượng lớn các cột, điều đó có nghĩa là phải giải quyết riêng từng cột: 'c [:, 0], c [:, 1], c [:, 2], c [:, 3], .. .' – Rachie