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)
请注意,这并不保证字母出现在输出中的顺序,即使示例可能另有说明.
您将输出称为"列表".如果列表是您真正想要的,请替换''.join
为list
:
In [1]: list(set('aaabcabccd'))
Out[1]: ['a', 'c', 'b', 'd']
Run Code Online (Sandbox Code Playgroud)
就性能而言,在这个阶段担心它听起来像是过早的优化.
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)
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)
为了完整起见,这是另一个将字母作为其工作方式的副产品进行排序的方法:
>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
Run Code Online (Sandbox Code Playgroud)