Python 根据带循环的模式匹配两个列表的元素

Python 根据带循环的模式匹配两个列表的元素,python,list,loops,Python,List,Loops,我需要的代码,将给出这些结果的基础上,这两个列表。 列表中的项目数量实际上比示例中的项目数量要多 list1=['a','a','a','b','b','c'] 列表2=['d','e','f','g','h','i'] 结果a=['a','d','e','f'] 结果_b=['b','g','h'] 结果_c=['c','i'] 使用zip和itertools.groupby: result_a, result_b, result_c = ( [group[0][0]] + [t[1]

我需要的代码,将给出这些结果的基础上,这两个列表。 列表中的项目数量实际上比示例中的项目数量要多

list1=['a','a','a','b','b','c']
列表2=['d','e','f','g','h','i']
结果a=['a','d','e','f']
结果_b=['b','g','h']
结果_c=['c','i']

使用
zip
itertools.groupby

result_a, result_b, result_c = (
    [group[0][0]] + [t[1] for t in group] 
    for group in (
        list(group) 
        for _, group in itertools.groupby(
            zip(list1, list2), lambda t: t[0]
        )
    )
)

可能最容易理解的代码是使用
计数器
来计算
列表1
中每个项目的数量,然后从
列表2
中分割出许多项目,同时移动起点和终点:

from collections import Counter

list1 = ['a','a', 'a', 'b', 'b', 'c']
list2 = ['d', 'e', 'f', 'g', 'h', 'i']

start = 0
for letter, count in Counter(list1).items():
    # Add the letter from list1 to the new list
    l = [letter]
    end = start + count
    # Add the slice of list2 to the new list
    l.extend(list2[start:end])
    print(l)
    # Move the start position on list2
    start = end
使用
zip()
将两个列表的相应元素配对。使用
list1
中的值作为字典的键,并将
list2
中的元素添加到相应的值中

results = {}
for key, value in zip(list1, list2):
    if key in results:
        results[key].append(value)
    else:
        results[key] = [key, value]

你试过什么?请发布您的代码并解释您遇到的任何问题。您能解释产生这些结果的逻辑吗?您应该制作一个字典,其键是
list1
的元素。每个值都是与键相对应的
list2
元素的列表。我认为请求是“对于list1中出现的每个项目,从列表2中选择那么多的项目”。因此3
a
给出
a,d,e,f
,2
b
给出
b,g,h
,1
c
给出
c,i
。至少我的回答是这样的!我喜欢使用dict对它们进行分组,但是如果
list2
中的元素也在
list1
中,该怎么办?@Samwise为什么会出现问题?问题中没有任何内容表明需要删除重复项。
对于zip中的k,v(列表1,列表2):results.setdefault(k,[k]).append(v)
这是相同的,我不知道两者中的哪一个被认为是pythonicah抱歉,问题不是列表2/列表1冲突,如果您在
list1
中有不连续的重复项。@Ch3steR我知道可以使用
setdefault
defaultdict
,我不仅对这些习语很流利,所以我使用
if/else
。请检查问题“列表中的项目数量实际上比示例中的项目数量更多。”