将两个不同大小的列表组合成一个组合

问题描述:

我试图将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中有这样干净的方法吗?

+2

考虑'itertools.izip'沿着'itertools.cycle'你的短名单。 – erewok

您可以使用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'}] 
+0

道歉。我只注意到我们的答案是一样的,而且你的答案也早一些。将时间添加到你的,我会删除我的。 – Alexander

+0

@Alexander完全没问题!谢谢。 – Ajax1234

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))