字符串中所有唯一字符的列表?

时间:2012-12-16 15:33:25

标签: python performance data-structures

我想将字符追加到字符串中,但希望确保最终列表中的所有字母都是唯一

示例:"aaabcabccd""abcd"

当然,我脑子里有两个解决方案。一种是使用list来映射字符及其ASCII码。因此,每当我遇到一封信时,它会将索引设置为True。之后我将扫描列表并附加所有已设置的列表。它的时间复杂度为 O(n)

另一种解决方案是使用dict并遵循相同的程序。映射每个char后,我将对字典中的每个键执行操作。这也将具有线性运行时间。

由于我是一个Python新手,我想知道哪个更节省空间。哪一个可以更有效地实施?

PS :创建列表时,订单 很重要。

7 个答案:

答案 0 :(得分:76)

最简单的解决方案可能是:

In [10]: ''.join(set('aaabcabccd'))
Out[10]: 'acbd'

请注意,这并不保证字母在输出中的显示顺序,即使示例可能暗示其他情况。

您将输出称为"列表"。如果列表是您真正想要的,请将''.join替换为list

In [1]: list(set('aaabcabccd'))
Out[1]: ['a', 'c', 'b', 'd']

就性能而言,在这个阶段担心它听起来像是过早优化。

答案 1 :(得分:15)

使用OrderedDict。这将确保订单保留

>>> ''.join(OrderedDict.fromkeys( "aaabcabccd").keys())
'abcd'

PS:我只是为OrderedDict和Set解决方案计时,后者更快。如果顺序无关紧要,那么set应该是自然的解决方案,如果Order Matter;这就是你应该做的。

>>> from timeit import Timer
>>> t1 = Timer(stmt=stmt1, setup="from __main__ import data, OrderedDict")
>>> t2 = Timer(stmt=stmt2, setup="from __main__ import data")
>>> t1.timeit(number=1000)
1.2893918431815337
>>> t2.timeit(number=1000)
0.0632140599081196

答案 2 :(得分:2)

为了完整起见,这里有另一个方法,将字母排序为其工作方式的副产品:

>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'

答案 3 :(得分:1)

如果结果不需要保留订单,那么您只需使用集合

即可
>>> ''.join(set( "aaabcabccd"))
'acbd'
>>>

答案 4 :(得分:0)

我有个主意。为什么不使用'abcd'常量?

例如,运行以下代码:

{{1}}

将打印{{1}}

你去,所有重复删除并可选择排序

答案 5 :(得分:0)

在列表中存储唯一字符

方法1:

uniue_char = list(set('aaabcabccd'))
#['a', 'b', 'c', 'd']

方法2:按循环(复杂)

uniue_char = []
for c in 'aaabcabccd':
    if not c in uniue_char:
        uniue_char.append(c)
print(uniue_char)
#['a', 'b', 'c', 'd']

答案 6 :(得分:0)

char_seen = []
for char in string:
    if char not in char_seen:
        char_seen.append(char)
print(''.join(char_seen))

这将保留字母的出现顺序,

输出将为

abcd