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

Ali*_*Ali 36 python performance data-structures

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

示例:"aaabcabccd""abcd"

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

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

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

PS:创建列表时顺序并不重要.

NPE*_*NPE 79

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

In [10]: ''.join(set('aaabcabccd'))
Out[10]: 'acbd'
Run Code Online (Sandbox Code Playgroud)

请注意,这并不保证字母出现在输出中的顺序,即使示例可能另有说明.

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

In [1]: list(set('aaabcabccd'))
Out[1]: ['a', 'c', 'b', 'd']
Run Code Online (Sandbox Code Playgroud)

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

  • @Ali:我没有说它更有效(尽管几乎可以肯定)。我的观点是,您应该首先关注清晰度和正确性,并且只有在一切正常并且您已经对代码进行了分析并知道要优化的*内容时才进行优化。 (2认同)

Abh*_*jit 15

使用OrderedDict.这将确保订单得以保留

>>> ''.join(OrderedDict.fromkeys( "aaabcabccd").keys())
'abcd'
Run Code Online (Sandbox Code Playgroud)

PS:我只是为OrderedDict和Set解决方案计时,后者更快.如果订单无关紧要,那么设置应该是自然的解决方案,如果订单问题;这就是你应该怎么做.

>>> 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
Run Code Online (Sandbox Code Playgroud)


Ami*_*pta 7

char_seen = []
for char in string:
    if char not in char_seen:
        char_seen.append(char)
print(''.join(char_seen))
Run Code Online (Sandbox Code Playgroud)

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

输出将是

abcd
Run Code Online (Sandbox Code Playgroud)


mar*_*eau 5

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

>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
Run Code Online (Sandbox Code Playgroud)