Python:字符串列表以列出唯一字符

2024-10-01 15:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串列表

ll = ['abc', 'abd', 'xyz', 'xzk']

我想要一个特定列表中所有字符串的唯一字符列表。在

对于ll,输出应该是

^{pr2}$

有没有一个干净的方法来做这个?在


Tags: 方法字符串列表字符abcllxyzabd
3条回答

这是一种维持秩序的低效方法。当总的字符数很小时就可以了,否则,应该使用Martijn的OrderedDict方法。在

ll = ['abc', 'abd', 'xyz', 'xzk']
s = ''.join(ll)
print(sorted(set(s), key=s.index))

输出

^{pr2}$

这里有另一种方法来保持顺序,它不那么紧凑,但比前面的方法更有效。在

ll = ['abc', 'abd', 'xyz', 'xzk']
d = {c: i for i, c in enumerate(reversed(''.join(ll)))}
print(sorted(d, reverse=True, key=d.get))   

输出

^{pr2}$

使用s.index作为键函数效率低下,因为它必须对其排序的每个字符对s字符串执行线性扫描,而my ddict可以获得O(1)中每个字符的索引。我使用reversed迭代器是因为我们希望早期的字符覆盖同一个字符的后面的副本,并且使用reversed比用[::-1]构建新的字符串更有效。在

创建ddict只比创建set(s)稍微慢一点,而且可能比使用OrderedDict稍快一点,当然它使用更少的RAM。在

您需要生成一组字母:

{l for word in ll for l in word}

您可以随时将其转换回列表:

^{pr2}$

演示:

>>> ll = ['abc', 'abd', 'xyz', 'xzk']
>>> {l for word in ll for l in word}
{'b', 'a', 'x', 'k', 'd', 'c', 'z', 'y'}

您还可以使用^{}为所有字符提供一个迭代器:

from itertools import chain

set(chain.from_iterable(ll))

如果必须有一个反映字符第一次出现顺序的列表,可以使用^{} object代替集合,然后用list()提取密钥:

from collections import OrderedDict
from itertools import chain

list(OrderedDict.fromkeys(chain.from_iterable(ll)))

演示:

>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(chain.from_iterable(ll)))
['a', 'b', 'c', 'd', 'x', 'y', 'z', 'k']

我不知道最简单的方法,但我知道一种方法:

list = ['abc', 'abd', 'xyz', 'xzk']
new=set()
for word in list:
    for letter in word:
        new.add(letter)
print(new)

对于初学者来说这是一个简单的方法,因为它不需要任何你可能还不知道如何使用的模块。在

相关问题 更多 >

    热门问题