[英]Merge python lists of different lengths
我試圖合並兩個python列表,其中給定索引的值將在新列表中形成一個列表(元素)。 例如:
merge_lists([1,2,3,4], [1,5]) = [[1,1], [2,5], [3], [4]]
我可以迭代這個函數來組合更多的列表。 實現這一目標的最有效方法是什么?
在測試了我之前選擇的答案后,我意識到我有其他標准和更普遍的問題。 我還想結合包含列表或值的列表。 例如:
merge_lists([[1,2],[1]] , [3,4]) = [[1,2,3], [1,4]]
目前提供的答案會在這種情況下生成更高維度的列表。
一種選擇是使用itertools.zip_longest
(在python 3中):
from itertools import zip_longest
[[x for x in t if x is not None] for t in zip_longest([1,2,3,4], [1,5])]
# [[1, 1], [2, 5], [3], [4]]
如果您喜歡套裝:
[{x for x in t if x is not None} for t in zip_longest([1,2,3,4], [1,5])]
# [{1}, {2, 5}, {3}, {4}]
在python 2中,使用itertools.izip_longest
:
from itertools import izip_longest
[[x for x in t if x is not None] for t in izip_longest([1,2,3,4], [1,5])]
#[[1, 1], [2, 5], [3], [4]]
更新以處理稍微復雜的情況:
def flatten(lst):
result = []
for s in lst:
if isinstance(s, list):
result.extend(s)
else:
result.append(s)
return result
這很好地處理了上述兩種情況:
[flatten(x for x in t if x is not None) for t in izip_longest([1,2,3,4], [1,5])]
# [[1, 1], [2, 5], [3], [4]]
[flatten(x for x in t if x is not None) for t in izip_longest([[1,2],[1]] , [3,4])]
# [[1, 2, 3], [1, 4]]
注意即使這適用於上述兩種情況,但它仍然可以在更深層次的嵌套結構下破解,因為案例可能會很快變得復雜。 有關更通用的解決方案,請參閱此處 。
你可以使用itertools.izip_longest
和filter()
:
>>> lst1, lst2 = [1, 2, 3, 4], [1, 5]
>>> from itertools import izip_longest
>>> [list(filter(None, x)) for x in izip_longest(lst1, lst2)]
[[1, 1], [2, 5], [3], [4]]
工作原理: izip_longest()
聚合兩個列表中的元素,使用None
s填充缺失值,然后使用filter()
過濾掉。
使用zip()
獲得所需輸出的另一種方法:
def merge(a, b):
m = min(len(a), len(b))
sub = []
for k,v in zip(a,b):
sub.append([k, v])
return sub + list([k] for k in a[m:]) if len(a) > len(b) else sub + list([k] for k in b[m:])
a = [1, 2, 3, 4]
b = [1, 5]
print(merge(a, b))
>>> [[1, 1], [2, 5], [3], [4]]
使用來自itertools的zip_longest和鏈的另一種方法:
import itertools
[i for i in list(itertools.chain(*itertools.zip_longest(list1, list2, list3))) if i is not None]
或2行(更易讀):
merged_list = list(itertools.chain(*itertools.zip_longest(a, b, c)))
merged_list = [i for i in merged_list if i is not None]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.