【发布时间】:2015-08-17 19:01:37
【问题描述】:
这道题和Group Python list of lists into groups based on overlapping items这道题很像,其实可以说是重复题了。
基本上,我有一个子列表列表,其中每个子列表包含一些整数(这个数字在子列表中不一样)。我需要对共享一个或多个整数的所有子列表进行分组。
我提出一个新的单独问题的原因是因为我试图改编 Martijn Pieters 的great answer,但没有成功。
这是 MWE:
def grouper(sequence):
result = [] # will hold (members, group) tuples
for item in sequence:
for members, group in result:
if members.intersection(item): # overlap
members.update(item)
group.append(item)
break
else: # no group found, add new
result.append((set(item), [item]))
return [group for members, group in result]
gr = [[29, 27, 26, 28], [31, 11, 10, 3, 30], [71, 51, 52, 69],
[78, 67, 68, 39, 75], [86, 84, 81, 82, 83, 85], [84, 67, 78, 77, 81],
[86, 68, 67, 84]]
for i, group in enumerate(grouper(gr)):
print 'g{}:'.format(i), group
我得到的输出是:
g0: [[29, 27, 26, 28]]
g1: [[31, 11, 10, 3, 30]]
g2: [[71, 51, 52, 69]]
g3: [[78, 67, 68, 39, 75], [84, 67, 78, 77, 81], [86, 68, 67, 84]]
g4: [[86, 84, 81, 82, 83, 85]]
最后一组g4 应该与g3 合并,因为其中的列表共享项目81、83 和84,即使是一个重复的元素也应该足以让它们合并。
我不确定是我应用代码错误,还是代码有问题。
【问题讨论】:
-
我不认为你做错了什么;该代码不处理由于遇到事物的顺序而存在级联合并的情况。 (例如,
grouper([[1,1],[1,2],[2,2]])有效,但grouper([[1,1],[2,2],[1,2]])无效。