我想在列表中找到在字符串的后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']
答案 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']