4 回答

TA贡献1798条经验 获得超3个赞
您可以使用函数dict.fromkeys()和chain.from_iterable():
from itertools import chain
list(dict.fromkeys(chain.from_iterable(wordlist)))
# ['m', 'i', 'c', 'r', 'o', 'a', 's', 't']
在 Python 3.6 及更低版本中,您需要替换dict为OrderedDict.

TA贡献1813条经验 获得超2个赞
不可以。你不能使用列表推导来做到这一点,因为你需要创建一个已经看到的字母列表。我相信您最好的做法是使用 for 循环。如果您需要保持字母的顺序,请同时使用列表和集合(保持顺序的列表,集合对每个字母进行 O(1) 成员资格测试)。如果顺序无关紧要,那么只需使用集合理解,即{letter for word in word_list for letter in word}
请注意,使用列表推导来解决其副作用(即创建已看到的字母的辅助列表)并不是 Pythonic。 将列表推导用于副作用是 Pythonic 吗?
word_list = ["micro", "macro", "stats"]
letter_list = []
letters_seen = set()
for word in word_list:
for letter in word:
if letter in letters_seen:
continue
letters_seen.add(letter)
letter_list.append(letter)
>>> letter_list
['m', 'i', 'c', 'r', 'o', 'a', 's', 't']
时间
wordlist = ["micro", "macro", "stats"] * 100_000
%%timeit
res=[]
[res.append(aletter) for aword in wordlist for aletter in aword if aletter not in res]
# 174 ms ± 8.37 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
letter_list = []
letters_seen = set()
for word in wordlist:
for letter in word:
if letter in letters_seen:
continue
letters_seen.add(letter)
letter_list.append(letter)
# 71.1 ms ± 1.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit list(dict.fromkeys(''.join(wordlist)))
# 37.1 ms ± 1.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit list(dict.fromkeys(chain.from_iterable(wordlist)))
# 46.8 ms ± 2.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Slightly slower, but requires less memory to run.
# Baseline comparison if order is not important (i.e. use sets).
%timeit {letter for word in wordlist for letter in word}
# 88.8 ms ± 6.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

TA贡献2003条经验 获得超2个赞
您可以通过以下方式执行此操作
from collections import OrderedDict
wordlist = ["micro", "macro", "stats"]
sol = list(OrderedDict.fromkeys(''.join(wordlist)).keys())
print(sol)
输出
['m', 'i', 'c', 'r', 'o', 'a', 's', 't']
你也可以使用
sol = [*OrderedDict.fromkeys(''.join(wordlist)).keys()]
使用dict它可以做为
sol = list(dict((i,1) for i in ''.join(wordlist)).keys())
在此处添加@alexander 解决方案
sol = list(dict.fromkeys(''.join(wordlist)))

TA贡献1796条经验 获得超4个赞
您可以将输出保存在单独的列表中,例如:
wordlist = ["micro", "macro", "stats"]
res=[]
[res.append(aletter) for aword in wordlist for aletter in aword if aletter not in res]
print(res)
或者
list(set([aletter for aword in wordlist for aletter in aword]))
希望这可以帮助!
添加回答
举报