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中选择那么多的项目”。因此3a
给出a,d,e,f
,2b
给出b,g,h
,1c
给出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
。请检查问题“列表中的项目数量实际上比示例中的项目数量更多。”