我有以下是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]
我猜这种分组有一个特定的名称。是否有可以自动处理的库?或者我是否必须编写手动搜索方式?
我希望编辑能让我更清楚地了解我想要实现的目标。
感谢。
答案 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]