合并包含公共元素的子列表

时间:2016-11-19 13:59:09

标签: python

我正在尝试编写一个快速函数,它将遍历子列表中的元素并合并子列表(如果它们包含元素)。例如,列表(?<=_)应合并到[[0, 3], [3, 4], [5, 6]]子列表可以是任意大小,每个子列表可以具有不同的大小,因此可以包含许多元素。

到目前为止我的代码(不起作用)如下所示。出现的错误是:[[0, 3, 4], [5, 6]].

slice indices must be integers or None or have an __index__ method

3 个答案:

答案 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][:]

#2result[-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

希望这可以帮助你:)