文字列に文字を追加したいのですが、最終リストのすべての文字がniqueであることを確認したいです。
例:"aaabcabccd"
→"abcd"
もちろん、私には2つの解決策があります。 1つは、文字をASCII=コードでマップするlist
を使用しています。したがって、文字に遭遇するたびに、インデックスをTrue
に設定します。リストをスキャンし、設定されたものをすべて追加します。時間の複雑さはO(n)です。
別の解決策は、dict
を使用して同じ手順に従うことです。すべての文字をマッピングした後、辞書の各キーに対して操作を行います。これにはlinear実行時間も含まれます。
私はPython初心者なので、どちらがよりスペース効率が良いのか疑問に思っていました。どちらをより効率的に実装できるでしょうか?
[〜#〜] ps [〜#〜]:順序はnot作成中に重要ですリスト。
最も簡単な解決策はおそらく次のとおりです。
In [10]: ''.join(set('aaabcabccd'))
Out[10]: 'acbd'
これは、例が別の方法を示唆している場合でも、文字が出力に表示される順序を保証するものではないことに注意してください。
出力を「リスト」と呼びます。リストが本当に必要なものである場合は、''.join
with list
:
In [1]: list(set('aaabcabccd'))
Out[1]: ['a', 'c', 'b', 'd']
パフォーマンスに関する限り、この段階でそれを心配することは時期尚早な最適化のように聞こえます。
OrderedDict を使用します。これにより、順序が保持されます。
>>> ''.join(OrderedDict.fromkeys( "aaabcabccd").keys())
'abcd'
PS:OrderedDictとSetの両方のソリューションのタイミングを計ったところ、後者の方が高速です。順序が重要でない場合、順序が重要な場合、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
完全を期すために、文字を動作方法の副産物として分類する別のレシピを次に示します。
>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
結果が順序を維持する必要がない場合は、単純にセットを使用できます
>>> ''.join(set( "aaabcabccd"))
'acbd'
>>>
考えがある。 ascii_lowercase
定数を使用しないのはなぜですか?
たとえば、次のコードを実行します。
# string module, contains 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 oce, 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)
'abcd'
を印刷します
そこに行くと、すべての重複が削除され、オプションでソートされます
リストに一意の文字を保存する
方法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']