我正在尝试编写一个快速函数,它将遍历子列表中的元素并合并子列表(如果它们包含元素)。例如,列表(?<=_)
应合并到[[0, 3], [3, 4], [5, 6]]
子列表可以是任意大小,每个子列表可以具有不同的大小,因此可以包含许多元素。
到目前为止我的代码(不起作用)如下所示。出现的错误是:[[0, 3, 4], [5, 6]].
slice indices must be integers or None or have an __index__ method
答案 0 :(得分:1)
如果子集已经排序,我会尝试用集合做一些事情。
from itertools import islice
def merge(T):
idx = 0
result = [set(T[0])]
for sublst in islice(T, 1, len(T)):
subset = set(sublst)
if result[idx] & subset:
result[idx].update(subset)
else:
result.append(set(sublst))
idx += 1
return [sorted(sub) for sub in result]
答案 1 :(得分:1)
这是一个适用于任何类型子列表的解决方案,无论它是否已排序:
def join_clusters(clusters):
result = clusters[:1] #1
for cluster in clusters[1:]:
if cluster[0] == result[-1][-1]:
result[-1] = result[-1] + cluster[1:] #2
else:
result.append(cluster) #3
return result
示例:
>>> c1 = [[0, 3], [3, 4], [5, 6]]
>>> join_clusters(c1)
[[0, 3, 4], [5, 6]]
>>> c2 = [[3, 1], [1, 2], [1, 3], [2, 1], [1, 3], [3, 1], [1, 2]]
>>> join_clusters(c2)
[[3, 1, 2], [1, 3], [2, 1, 3, 1, 2]]
>>> les_mis = "At the end of the day you're another day older".split()
>>> join_clusters(les_mis)
['Athend', 'of', 'the', "dayou're", 'another', 'day', 'older']
注意:
#1
:如果您希望输出仅包含输入的副本,而不是实际的原始子列表,请使用result = clusters[:1][:]
。
#2
:result[-1] += cluster[1:]
未使用,因为它会改变原始列表的元素,这可能是不合需要的。
#3
:如果您希望输出仅包含输入的副本,而不是实际的原始子列表,请使用result.append(cluster[:])
。
答案 2 :(得分:0)
我使用了while循环,以便更容易引用列表中的下一个群集
def join_clusters(clusters):
idx = 0
while idx < len(clusters) - 1:
for element in clusters[idx]:
if element in clusters[idx + 1]:
clusters[idx].remove(element)
clusters[idx] = clusters[idx] + clusters[idx + 1]
del(clusters[idx + 1])
break
idx = idx + 1
return clusters
希望这可以帮助你:)