Python 在列表列表中查找元素的公共序列

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

我有一个包含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, 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]作为子列表中的公共数