在列表中查找项目结尾的重复项

时间:2019-05-24 15:21:57

标签: python list

我想在列表中找到在字符串的后3个字符内具有重复结尾的项目

我知道如何使用以下代码查找重复项,但是需要有关如何查找代码的帮助 确保“ sara”和“ tamara”的最后一个字符串相同,以便其中一项可以复制到重复查找列表中

使用以下代码,我只能确定列表中完全相同的重复项:

names = ["tom", "john", "sara" , "tamara" , "tom"]
single_finds = []
duplicate_finds = []

for i in names:
        if i in single_finds:
                duplicate_finds.append(i)
        else:
                single_finds.append(i)

print (single_finds)
print (duplicate_finds)

输出:

['tom', 'john', 'sara', 'tamara']
['tom']

4 个答案:

答案 0 :(得分:6)

一种方法是使用itertools.groupby,指定我们要使用n参数基于最后key个字符进行分组。

然后,我们可以使用itertools.chain来将列表中只有1个项目的子列表弄平,并采取一组操作来删除重复项(如果需要,可以删除list):

from itertools import groupby, chain
k = lambda x: x[-3:]
l = [list(v) for _,v in groupby(sorted(names, key=k), key=k)]
# [['tamara', 'sara'], ['john'], ['tom', 'tom']]
[i[0] for i in l if len(i) > 1]
# ['tamara', 'tom']

答案 1 :(得分:2)

使用dict累积每个后缀的名称,然后收集结果:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> for name in names: 
...     suffix = name[-3:] 
...     d[suffix].append(name) 
... 
>>> for suffix, names in d.items(): 
...     print("-", suffix, ":", *names) 
... 
- tom : tom tom
- ohn : john
- ara : sara tamara

您可以立即查看d.items(),将len(names)分成单人和双人。

这是一个 O(n)时间复杂性解决方案,与基于groupby的方法相反,后者需要对 O(n log n)处的数据进行预排序

答案 2 :(得分:0)

通过从末尾开始对字符串进行切片,将列表按最后3个字符进行分组,如果名称组中包含的元素多于一个元素,则该列表为一个副本,否则为单个。

import itertools

names = ["tom", "john", "sara" , "tamara" , "tom"]

def find_duplicates(names):
    for key, group in itertools.groupby(sorted(names), lambda x: x[-3:]):
        grouped_items = list(group)
        if len(grouped_items) > 1:
            yield grouped_items[0]

def find_single(names):
    for key, group in itertools.groupby(sorted(names)):
        if len(list(group)) == 1:
            yield key

single_finds = list(find_single(names))
duplicate_finds = list(find_duplicates(names))

print ("Single finds", single_finds)
print ("Duplicate finds", duplicate_finds)

输出:

Single finds ['john', 'sara', 'tamara']
Duplicate finds ['sara', 'tom']

答案 3 :(得分:0)

要完成@wim线性时间答案:

import collections
res=collections.defaultdict(list)

for name in names: 
    res[name[-3:]].append(name)

singles,dummies= [],[]

for v in res.values():
    singles.extend(v[:1])
    dummies.extend(v[1:])

然后:

singles is ['tom', 'john', 'sara']

dummies is ['tom', 'tamara']