在Python中将数字列表分组在一起

时间:2017-10-05 13:13:35

标签: python grouping

我有以下是Python中列表的列表,并且是我的部分值列表:

[1,33]
[2,10,42]
[5,1,33,44]
[10,42,98]
[44,12,100,124]

有没有办法对它们进行分组,以便它们收集每个列表中常见的值?

例如,如果我查看第一个列表[1,33],我可以看到该值存在于第三个列表中:[5,1,33,44]

所以,这些被归为一类

[5,1,33,44]

如果我继续观察,我可以看到44位于最终列表中,因此将与此列表一起分组。

[44,12,100,124]被添加到[5,1,33,44]

给予: [1,5,12,33,44,100,124]

第二个列表[2,10,42]与[10,42,98]具有共同的值,因此它们连在一起给出: [2,10,42,98]

所以最终的名单是:

[1,5,12,33,44,100,124]

[2,10,42,98]

我猜这种分组有一个特定的名称。是否有可以自动处理的库?或者我是否必须编写手动搜索方式?

我希望编辑能让我更清楚地了解我想要实现的目标。

感谢。

1 个答案:

答案 0 :(得分:1)

这是一个不需要标准库或第三方软件包的解决方案。 请注意,这会修改a 。为避免这种情况,只需复制a并使用它即可。结果是包含结果排序列表的列表列表。

a = [
     [1,33],
     [2,10,42],
     [5,1,33,44],
     [10,42,98],
     [44,12,100,124]
    ]

res = []
while a:
    el = a.pop(0)
    res.append(el)
    for sublist in a:
        if set(el).intersection(set(sublist)):
            res[-1].extend(sublist)
            a.remove(sublist)
res = [sorted(set(i)) for i in res]
print(res)
# [[1, 5, 12, 33, 44, 100, 124], [2, 10, 42, 98]]

这是如何运作的:

  • 形成空结果列表res。来自a的分组将被转移"这里。
  • .pop()关闭a的第一个元素。这会修改a并将el定义为该元素。
  • 然后循环浏览a中的每个子列表,将弹出的el与这些子列表进行比较,然后"构建"共同集。这是你的问题有点棘手,因为你需要逐步增加相交的集合而不是一次找到多个子列表的交集。
  • 重复此过程,直到a为空。

或者,如果您只想将偶数和奇数编号的子列表组合在一起(从您的问题中仍然有点不清楚),您可以使用itertools:

from itertools import chain
grp1 = sorted(set(chain.from_iterable(a[::2])))
grp2 = sorted(set(chain.from_iterable(a[1::2])))
print(grp1)
print(grp2)
# [1, 5, 12, 33, 44, 100, 124]
# [2, 10, 42, 98]