【发布时间】:2013-04-24 17:38:40
【问题描述】:
我有一个列表列表,我正在尝试根据它们的项目对它们进行分组或聚类。如果没有元素在前一个组中,则嵌套列表会启动一个新组。
输入:
paths = [
['D', 'B', 'A', 'H'],
['D', 'B', 'A', 'C'],
['H', 'A', 'C'],
['E', 'G', 'I'],
['F', 'G', 'I']]
我失败的代码:
paths = [
['D', 'B', 'A', 'H'],
['D', 'B', 'A', 'C'],
['H', 'A', 'C'],
['E', 'G', 'I'],
['F', 'G', 'I']
]
groups = []
paths_clone = paths
for path in paths:
for node in path:
for path_clone in paths_clone:
if node in path_clone:
if not path == path_clone:
groups.append([path, path_clone])
else:
groups.append(path)
print groups
预期输出:
[
[
['D', 'B', 'A', 'H'],
['D', 'B', 'A', 'C'],
['H', 'A', 'C']
],
[
['E', 'G', 'I'],
['F', 'G', 'I']
]
]
另一个例子:
paths = [['shifter', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'barrel shifter'],
['IP power', 'IP', 'power'],
['ARM', 'barrel', 'shifter']]
预期输出组:
output = [
[['shifter', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'shifter']],
[['IP power', 'IP', 'power']],
]
【问题讨论】:
-
组的定义是什么?而
paths_clone是对同一个列表的引用,而不是副本。使用paths[:]创建副本。 -
@MartijnPieters 该组基本上是所有具有重叠项目的列表。如上所示,我需要一种方法来根据与其他列表相同的项目对列表进行聚类。
-
所以当一个新组中的项目没有出现在前一个组中时,或者在上一个item中出现时,一个新组开始?
-
@MartijnPieters 是的!上一组