我想将字符追加到字符串中,但希望确保最终列表中的所有字母都是唯一。
示例:"aaabcabccd"
→"abcd"
当然,我脑子里有两个解决方案。一种是使用list
来映射字符及其ASCII码。因此,每当我遇到一封信时,它会将索引设置为True
。之后我将扫描列表并附加所有已设置的列表。它的时间复杂度为 O(n)。
另一种解决方案是使用dict
并遵循相同的程序。映射每个char后,我将对字典中的每个键执行操作。这也将具有线性运行时间。
由于我是一个Python新手,我想知道哪个更节省空间。哪一个可以更有效地实施?
PS :创建列表时,订单 不 很重要。
答案 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