Python 在列表列表中查找元素的公共序列
我有一个包含Id的列表,如下所示-Python 在列表列表中查找元素的公共序列,python,pandas,list,Python,Pandas,List,我有一个包含Id的列表,如下所示- [[45, 41, 20, 25, 78], [54, 12, 45, 36, 59], [45, 12, 45, 41, 88], [74, 85, 41, 20, 25], [54, 45, 36, 59], [74, 20, 25]] 问题1:我需要所有列表在一个列表中具有相同的前缀(列表以相同的数字开头)。 期望输出 [[45, 41, 20, 25, 78], [45, 12, 45, 41, 88]] [[54, 12, 45, 36
[[45, 41, 20, 25, 78],
[54, 12, 45, 36, 59],
[45, 12, 45, 41, 88],
[74, 85, 41, 20, 25],
[54, 45, 36, 59],
[74, 20, 25]]
问题1:我需要所有列表在一个列表中具有相同的前缀(列表以相同的数字开头)。
期望输出
[[45, 41, 20, 25, 78],
[45, 12, 45, 41, 88]]
[[54, 12, 45, 36, 59],
[54, 45, 36, 59]]
[[74, 85, 41, 20, 25],
[74, 20, 25]]
问题2:稍后在相应的子列表中查找公共元素。例如:
[[45, 41, 20, 25, 78],
[45, 12, 45, 41, 88]]
在此列表中,常见元素为[45,41]
最终期望输出:
[[45, 41],
[54, 45, 36, 59],
[74, 20, 25]]
对于问题1,您可以使用
itertools.groupby
:
from itertools import groupby
orig_list = [[45, 41, 20, 25, 78],
[54, 12, 45, 36, 59],
[45, 12, 45, 41, 88],
[74, 85, 41, 20, 25],
[54, 45, 36, 59],
[74, 20, 25]]
sorted_list = sorted(orig_list, key=lambda l: l[0])
list1 = [list(g) for _, g in groupby(sorted_list, lambda l:l [0])]
输出:
[[[45, 41, 20, 25, 78], [45, 12, 45, 41, 88]],
[[54, 12, 45, 36, 59], [54, 45, 36, 59]],
[[74, 85, 41, 20, 25], [74, 20, 25]]]
[[41, 45], [59, 36, 45, 54], [25, 74, 20]]
[[45, 41], [54, 45, 36, 59], [74, 20, 25]]
对于问题2,您可以使用集合交点;但是,它不会保持秩序:
[list(set.intersection(*[set(s) for s in sublists])) for sublists in list1]
输出:
[[[45, 41, 20, 25, 78], [45, 12, 45, 41, 88]],
[[54, 12, 45, 36, 59], [54, 45, 36, 59]],
[[74, 85, 41, 20, 25], [74, 20, 25]]]
[[41, 45], [59, 36, 45, 54], [25, 74, 20]]
[[45, 41], [54, 45, 36, 59], [74, 20, 25]]
如果您想保留顺序,并且始终有2个子列表,您可以尝试以下方法:
[[x for x in sublist[0] if x in sublist[1]] for sublist in list1]
输出:
[[[45, 41, 20, 25, 78], [45, 12, 45, 41, 88]],
[[54, 12, 45, 36, 59], [54, 45, 36, 59]],
[[74, 85, 41, 20, 25], [74, 20, 25]]]
[[41, 45], [59, 36, 45, 54], [25, 74, 20]]
[[45, 41], [54, 45, 36, 59], [74, 20, 25]]
如果可能有其他数量的子列表(超过2个或仅1个),则可以如下调整:
[[x for x in sublist[0] if all([x in s for s in sublist[1:]])] for sublist in pre_list]
我认为这是您的解决方案
list1 = [[45, 41, 20, 25, 78],[54, 12, 45, 36, 59],[45, 12, 45, 41, 88],[74, 85, 41, 20, 25],[54, 45, 36, 59],[74, 20, 25]]
converted_list = []
i=0
while i <= (len(list1)/2)+1:
a = list1.pop(0)
print(a)
for j in list1:
if j[0]==a[0]:
b = list1.pop(list1.index(j))
converted_list.append([a,b])
break
i+=1
print(converted_list)
final_list = []
for i in converted_list:
common_list = []
for j in i[0]:
if j in i[1]:
common_list.append(j)
final_list.append(common_list)
print(final_list)
list1=[[45,41,20,25,78],[54,12,45,36,59],[45,12,45,41,88],[74,85,41,20,25],[54,45,36,59],[74,20,25]]
转换的_列表=[]
i=0
我真的不明白你是怎么进入期末考试的output@juanpa.arrivillaga我已经编辑了这个问题。希望这对于第一步来说是可以理解的,迭代外部列表并将元素(内部列表)放在一个dict中,以内部列表的第一个数字作为键,然后.values()
就是您想要的。(也不明白第二步)我已经更新了答案。它假设第一个元素的子列表不超过2个。如果只有一个子列表,而另一个子列表无法处理,那么这也需要注意。对于问题2,我有多个子列表。如果有2个子列表,给定的代码可以正常工作。你能帮我找出多个子列表之间的共同数字吗?我答案中的最后一行代码不起作用吗?如果是这样的话,它如何不起作用?可能值得更新您的问题。如果有两个子列表,则在子列表中获取公共编号,但在处理多个子列表时则不获取公共编号。例如:[126,133],[126,259,22],[126,136,55],[126,86,84,50],[126,129,1,22],[126,86,12],[126,1216112],[126,1216112],[126,86,45,79,63,63,234,234,169],[126,94,129],[126,94,129],[126,86,84],[126,136,212,254,258],[126]作为子列表中的公共数