Как сохранить индекс списка строк после удаления дубликата? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть list, который содержит строки.Эти строки не одинаковы.Но после того, как я это сделаю,

alist = ['string1','string2'] #list of string
processed_alist = [some_function(s) for s in alist] #processing strings

В processed_alist есть некоторые дубликаты, и я хочу их удалить.Если я сделаю

processed_alist = list(set(processed_alist))

Все индексы строк должны быть зашифрованы, и я не могу проверить, какая строка из alist соответствует строке из processed_alist.

Есть ли способсохранить индекс строки в processed_alist, но я все еще могу удалить дубликат строки?

Например,

У меня есть

alist = ['sta','tsb','sat','tsa','tsd','stb']

и some_function(s) возвращаемая строка с символомs удалено.Итак, processed_alist будет

['ta','tb','at','ta','td','tb']

и после удаления дублирования станет

['ta','tb','at','td']

Я хочу удалить дубликат в processed_alist, но в то же время я хочу получитьисходная строка обработанной строки.Допустим, имя функции get_original.Итак, если я напишу

get_original(processed_alist[3])
#return 'tsd' because original string from 'td' is 'tsd'
get_original(processed_alist[0])
#return 'sta' or 'tsa'. I don't mind which one

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Самый простой метод - это использование OrderedDict:

>>> from collections import OrderedDict
>>> processed_alist = ['not a dupe', 'still not a dupe', 'i am dupe!', 'i am dupe!', 'err not a dupe']
>>> list(OrderedDict.fromkeys(processed_alist))
['not a dupe', 'still not a dupe', 'i am dupe!', 'err not a dupe']
0 голосов
/ 28 ноября 2018

Словари в Python 3.6+ сохраняют порядок.Вы можете использовать dict.fromkeys(), чтобы сохранить порядок при удалении дубликатов:

result = dict().fromkeys(map(some_function, alist)).keys()

Обратите внимание, что результатом является key объект, если вам обязательно нужен список (не очень хорошая идея, если вы просто хотитеитеративно) вместо этого вы должны сделать следующее:

result = list(dict().fromkeys(map(some_function, alist)))

Кроме того, если вы используете Python-3.6 - вы должны рассмотреть возможность использования collections.OrderedDict(), который делает то же самое с небольшой разницей в производительности.

Что касается следующей части map(some_function, alist), если some_function не является встроенной функцией, то лучше использовать понимание списка, если ваш код действительно нужен как можно быстрее.Причина этого в том, что map является встроенной функцией и прекрасно работает с функциями подобного рода (правило цепочки).

На основании вашего обновления вы можете просто использовать str.replace() вместо своей функциии выражение генератора с dict.fromkeys():

In [48]: dict().fromkeys(i.replace('s', '') for i in alist).keys()
Out[48]: dict_keys(['ta', 'tb', 'at', 'td'])

Обратите внимание, что в качестве альтернативы вы также можете использовать {} для создания пустого словаря, который также немного быстрее, чем прямой вызов типа dict.

In [49]: %timeit dict().fromkeys(i.replace('s', '') for i in alist).keys()

1.75 µs ± 3.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [50]: %timeit {}.fromkeys(i.replace('s', '') for i in alist).keys()
1.67 µs ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...