56

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

示例:"aaabcabccd""abcd"

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

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

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

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

4

7 回答 7

116

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

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

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

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

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

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

于 2012-12-16T15:36:04.277 回答
22

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

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

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
于 2012-12-16T15:36:38.740 回答
6

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

>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
于 2012-12-16T16:08:31.743 回答
4
char_seen = []
for char in string:
    if char not in char_seen:
        char_seen.append(char)
print(''.join(char_seen))

这将保留字母的顺序,

输出将是

abcd
于 2019-10-16T06:24:31.127 回答
3

如果结果不需要保持顺序,那么您可以简单地使用一个集合

>>> ''.join(set( "aaabcabccd"))
'acbd'
>>>
于 2012-12-16T15:36:13.683 回答
2

在列表中存储唯一字符

方法一:

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']
于 2019-06-03T11:36:16.080 回答
2

I have an idea. Why not use the ascii_lowercase constant?

For example, running the following code:

# string module contains the constant ascii_lowercase which is all the lowercase
# letters of the English alphabet
import string
# Example value of s, a string
s = 'aaabcabccd'
# Result variable to store the resulting string
result = ''
# Goes through each letter in the alphabet and checks how many times it appears.
# If a letter appears at least once, then it is added to the result variable
for letter in string.ascii_letters:
    if s.count(letter) >= 1:
        result+=letter

# Optional three lines to convert result variable to a list for sorting
# and then back to a string
result = list(result)
result.sort()
result = ''.join(result)

print(result)

Will print 'abcd'

There you go, all duplicates removed and optionally sorted

于 2017-10-26T14:55:26.423 回答