将两个不同大小的列表组合成一个组合
问题描述:
我试图将2个具有不同数据和大小的列表合并为1,并将较小的列表“换行”。我正在寻找一种干净的方式来做到这一点,例如将两个不同大小的列表组合成一个组合
输入:
list1 = ['apple', 'orange', 'strawberry', 'avocado']
list2 = ['1','2','3']
输出:
[
{"l1": "apple", "l2": "1"},
{"l1": "orange", "l2": "2"},
{"l1": "strawberry", "l2": "3"},
{"l1": "avocado", "l2": "1"}
]
注意,对于"avocado"
,我们又回到"1"
和周围包裹列表2。
显而易见的(看起来丑陋的)解决方案是从一个空的列表开始,在一个循环中有两个索引,每个迭代附加一个新的列表项,并且当它到达时,较小的一个'包装'到开始结束。 Python 2.7中有这样干净的方法吗?
答
您可以使用itertools.cycle
包住第二列表:
from itertools import cycle
lst = [dict(zip(['l1', 'l2'], tup)) for tup in zip(list1, cycle(list2))]
答
你可以使用一个生成器,避免追加到一个空表:
def func(l1, l2):
length1 = len(l1)
length2 = len(l2)
for idx in range(max(length1, length2)):
# I use the modulo so the indices wrap around.
yield {'l1': l1[idx % length1], 'l2': l2[idx % length2]}
list(func(list1, list2))
# [{'l1': 'apple', 'l2': '1'},
# {'l1': 'orange', 'l2': '2'},
# {'l1': 'strawberry', 'l2': '3'},
# {'l1': 'avocado', 'l2': '1'}]
然而itertools.cycle
(见对方的回答)是可能好多了。
答
为简单起见,您只能使用enumerate
;然而,一个清洁的解决方案将涉及itertools.cycle
:
list1 = ['apple', 'orange', 'strawberry', 'avocado']
list2 = ['1','2','3']
new_list = [{"li":a, "l2":list2[i%len(list2)]} for i, a in enumerate(list1)]
输出:
[{'l2': '1', 'li': 'apple'}, {'l2': '2', 'li': 'orange'}, {'l2': '3', 'li': 'strawberry'}, {'l2': '1', 'li': 'avocado'}]
答
def processing(opt, longlist, shortlist):
def processing_iter(inL, refL, outL):
if refL == []:
return outL
elif inL == []:
return processing_iter(shortlist, refL[1:], outL+opt(refL[0], shortlist[0]))
else:
return processing_iter(inL[1:], refL[1:], outL+opt(refL[0], inL[0]))
return processing_iter(shortlist, longlist, [])
def makedict(a,b): return [{"l1":a, "l2":b}]
list1 = ['apple', 'orange', 'strawberry', 'avocado']
list2 = ['1','2','3']
print(processing(makedict,list1, list2))
考虑'itertools.izip'沿着'itertools.cycle'你的短名单。 – erewok