Словари в 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)