Python从列表中删除部分重复项

3

我有一组项目列表,它们被错误地创建。它没有完整地复制每个项目,而是复制了相同项目的多个部分。这些部分复制品与其他复制品和一些独特的项目混合在一起。例如列表a:

a = ['one two','one two three four','one two three','five six','five six seven','eight nine']

我想删除部分重复项并保留该项的最长表达式。例如,我想生成列表b:

b = ['one two three four', 'five six seven','eight nine']

该项的完整性必须保持不变,不能变成:

c = '[two one three four', 'vife six seven', 'eight nine']


1
['12', '13', '1'] 的预期行为是什么?['12', '2'] 呢?['123', '2'] 呢? - Brian McCutchon
这个问题的限制很差。被丢弃的物品总是直接在前面吗? - wim
部分重复的内容是否总是出现在它们所重复的内容之前(或至少相邻)?或者'one two'可能出现在输入的最后,但仍应该被消除吗? - ShadowRanger
我刚刚更新了列表。最长的项目并不总是在最短的项目之后,它们的顺序是随机的。 - Mario Tomas
如果是这种情况,只需对它们进行排序,然后我的答案就可以起作用了。 - Dennis
2个回答

3

请尝试以下方法:

def group_partials(strings):
    it = iter(sorted(strings))
    prev = next(it)
    for s in it:
        if not s.startswith(prev):
            yield prev
        prev = s
    yield s

a = ['one two','one two three', 'one two three four', 'five six', 'five six seven', 'eight nine']
b = list(group_partials(a))

3
你可以使用集合来实现这个。
尝试一下这段代码。
a = ['one two','one two three', 'one two three four', 'five six', 'five six seven','eight nine']

# check for subsets
for i in range(len(a)):
   for j in range(len(a)):
      if i==j: continue # same index
      if (set(a[i].split()) & set(a[j].split())) == set(a[i].split()): # if subset
         a[i]="" # clear string

# a = [x for x in a if len(x)]  # remove empty strings

b = []
for x in a:  # each string in a
   if len(x) > 0: # if not empty
      b.append(x)  # add to final list  

a = b

print(a)

输出

['one two three four', 'five six seven', 'eight nine']

在迭代列表时更新它,使用索引以便内存地址保持不变。如果使用 for i in a,那么设置 i='abc' 不会更新列表,它只会创建一个局部变量。 - Mike67
不会总是将(set(a[i].split()))设置为(set(a[i].split()))。&的作用是什么,是将它们连接起来吗? - Mario Tomas
"x for x in a if len(x)" 这段代码的意思是从列表a中筛选出长度不为0的元素x,并将它们组成一个新的列表。如果您需要更详细的解释或学习材料,可以参考相关编程教程或文档。谢谢! - Mario Tomas
答案已更新,使用了 for 循环。之前的代码使用了列表推导式:https://jakevdp.github.io/WhirlwindTourOfPython/11-list-comprehensions.html - Mike67
值得注意的是,这种方法速度较慢(二次时间)。对于大型列表,Dennis的答案(添加排序)会快得多(O(n log n))。 - Brian McCutchon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接