Sha*_*kar 5 python algorithm list
我有一个列表列表,我正在尝试根据它们的项目对它们进行分组或聚类。如果没有任何元素位于前一组中,则嵌套列表将开始一个新组。
输入:
paths = [
['D', 'B', 'A', 'H'],
['D', 'B', 'A', 'C'],
['H', 'A', 'C'],
['E', 'G', 'I'],
['F', 'G', 'I']]
Run Code Online (Sandbox Code Playgroud)
我的失败代码:
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
Run Code Online (Sandbox Code Playgroud)
预期输出:
[
[
['D', 'B', 'A', 'H'],
['D', 'B', 'A', 'C'],
['H', 'A', 'C']
],
[
['E', 'G', 'I'],
['F', 'G', 'I']
]
]
Run Code Online (Sandbox Code Playgroud)
另一个例子:
paths = [['shifter', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'barrel shifter'],
['IP power', 'IP', 'power'],
['ARM', 'barrel', 'shifter']]
Run Code Online (Sandbox Code Playgroud)
预期输出组:
output = [
[['shifter', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'barrel shifter'],
['ARM', 'barrel', 'shifter']],
[['IP power', 'IP', 'power']],
]
Run Code Online (Sandbox Code Playgroud)
您基于集合进行分组,因此使用集合来检测新组:
def grouper(sequence):
group, members = [], set()
for item in sequence:
if group and members.isdisjoint(item):
# new group, yield and start new
yield group
group, members = [], set()
group.append(item)
members.update(item)
yield group
Run Code Online (Sandbox Code Playgroud)
这给出:
>>> for group in grouper(paths):
... print group
...
[['D', 'B', 'A', 'H'], ['D', 'B', 'A', 'C'], ['H', 'A', 'C']]
[['E', 'G', 'I'], ['F', 'G', 'I']]
Run Code Online (Sandbox Code Playgroud)
或者你可以再次将其投射到列表中:
output = list(grouper(paths))
Run Code Online (Sandbox Code Playgroud)
这假设这些组是连续的。如果您有不相交的组,则需要处理整个列表并循环遍历迄今为止为每个项目构建的所有组:
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]
Run Code Online (Sandbox Code Playgroud)