Python:唯一字符列表的字符串列表

时间:2017-08-19 16:42:27

标签: python

我有一个字符串列表

['a','b','c','d','x','y','z','k']

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

对于ll,输出应为

{{1}}

有一种干净的方法吗?

8 个答案:

答案 0 :(得分:9)

您想要生成字母的

{l for word in ll for l in word}

您始终可以将其转换回列表:

list({l for word in ll for l in word})

演示:

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

您还可以使用itertools.chain.from_iterable()为所有字符提供单个迭代器:

from itertools import chain

set(chain.from_iterable(ll))

如果您必须有一个反映第一次出现的字符顺序的列表,您可以使用collections.OrderedDict() 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']

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

这是一种保留订单的低效方式。当字符总数很小时就可以了,否则,你应该使用Martijn的OrderedDict方法。

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

<强>输出

['a', 'b', 'c', 'd', 'x', 'y', 'z', 'k']

这是保留订单的另一种方法,该订单不像以前的方法那样紧凑,但效率更高。

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

<强>输出

['a', 'b', 'c', 'd', 'x', 'y', 'z', 'k']

使用s.index作为关键函数是低效的,因为它必须对它排序的每个字符对s字符串执行线性扫描,而我的d字典可以获取索引O(1)中的每个角色。我使用reversed迭代器,因为我们希望先前的字符覆盖同一个字符串的后续重复项,并且使用reversed比使用[::-1]构建新字符串更有效。

创建d dict只比创建set(s)稍慢,并且它可能比使用OrderedDict快一点,它肯定使用更少的RAM。

答案 3 :(得分:0)

考虑使用set()

s = set()
 for word in ll:
   for letter in word:
     s.add(letter)

现在s应该包含所有独特的字母。您可以使用slist(s)转换为列表。

答案 4 :(得分:0)

您可以使用itertools

import itertools
ll = ['abc', 'abd', 'xyz', 'xzk']
set(itertools.chain(*[list(x) for x in ll]))

{'a', 'b', 'c', 'd', 'k', 'x', 'y', 'z'}

答案 5 :(得分:0)

这是一个你可以调用并给它列表的函数,它将返回所有独特的字母,我将它添加到最后打印

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

def uniqueLetters(lst1):
    unique = set()
    for word in lst1:
        for letter in word:
                unique.add(letter)
    return unique

print(uniqueLetters(lst))

要使用唯一变量获取变量,请调用函数,如下所示:

uniqueLetters123 = uniqueLetters(lst)

您可以将lst替换为您的列表名称。

答案 6 :(得分:0)

 l2 =list()
 for i in ll:
    for j in i:
        l2.append(j)

 [''.join(i) for i in set(l2)]          

输出:

'a', 'c', 'b', 'd', 'k', 'y', 'x', 'z'

答案 7 :(得分:0)

只是另一个......

>>> set().union(*ll)
{'d', 'a', 'y', 'k', 'c', 'x', 'b', 'z'}

如果需要,请将list(...)包裹起来,不过为什么会这样。