【问题标题】:Find common sequence of elements in list of lists在列表列表中查找共同的元素序列
【发布时间】:2020-12-15 06:48:48
【问题描述】:

我有包含以下 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]]

【问题讨论】:

  • 我真的不明白你是如何得到最终输出的
  • @juanpa.arrivillaga 我已经编辑了这个问题。希望这是可以理解的
  • 第一步,迭代外部列表并将元素(内部列表)放入一个字典中,其中内部列表的第一个数字作为键,然后 .values() 就是你想要的。 (第二步也看不懂)

标签: python pandas list


【解决方案1】:

您可以使用itertools.groupby 解决问题1:

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

对于问题 2,你可以使用 set intersection;但是,它不会保持秩序

[list(set.intersection(*[set(s) for s in sublists])) for sublists in list1]

输出:

[[41, 45], [59, 36, 45, 54], [25, 74, 20]]

如果你想保持顺序并且总是有 2 个子列表,你可以试试这个:

[[x for x in sublist[0] if x in sublist[1]] for sublist in list1]

输出:

[[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]

【讨论】:

  • 我已经更新了答案。它假定您没有超过 2 个具有相同第一个元素的子列表。
  • 如果有超过 2 个子列表,我添加了另一个选项。如果只有 1 个子列表,另一个不会处理,这也需要注意。所以这是一种更通用的方法。
  • 对于问题 2,我有多个子列表。如果有 2 个子列表,给定的代码可以正常工作。你能帮我找出多个子列表之间的共同数字吗?
  • 我的答案中的最后一行代码不起作用吗?如果是这样,它怎么不起作用?可能值得更新您的问题。
  • 如果有两个子列表,它会获取子列表中的公共数字,但在处理多个子列表时不会。例如:[[126, 133], [126, 259, 22], [126, 136, 55], [126, 86, 84, 50], [126, 129, 1, 22], [126, 86 , 12], [126, 1, 209], [126, 1, 216, 112], [126, 86, 45, 79, 45, 79, 63, 63, 234, 234, 234, 169], [126 , 94, 129], [126, 94, 129], [126, 86, 84], [126, 136, 212, 254, 258]] 对于上面的列表,我得到 [126] 作为子列表中的常用数字
【解决方案2】:

我认为这是您的解决方案

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2016-07-18
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多