найти дубликаты окончаний предметов в списке - PullRequest
8 голосов
/ 24 мая 2019

Я хотел бы найти элементы в списке, которые имеют одинаковые окончания в последних 3 символах строки

Я знаю, как найти дубликаты, используя код ниже, но мне нужна помощь с кодом, как найти этопоследние строки «sara» и «tamara» одинаковы, поэтому один из элементов можно скопировать в список duplicate_finding

, используя следующий код, я могу идентифицировать только точные повторяющиеся элементы списка:

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 ]

6 голосов
/ 24 мая 2019

Один из подходов - использовать itertools.groupby, указав, что мы хотим сгруппировать на основе последних n символов, используя аргумент key.

Тогда мы можем сгладитьсписок, удаляющий эти подсписки только с элементом 1 с использованием itertools.chain и набор для удаления дубликатов (или 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']
2 голосов
/ 24 мая 2019

Накапливайте имена по суффиксам, используя 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) решение со сложностью времени, в отличие от групповых подходов, которые требуют предварительной сортировки данных при O (n log n) .

0 голосов
/ 24 мая 2019

Для завершения @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']   
0 голосов
/ 24 мая 2019

Сгруппируйте список по последним 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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...