wake-up-neo.com

Liste aller eindeutigen Zeichen in einer Zeichenfolge?

Ich möchte Zeichen an eine Zeichenkette anhängen, möchte aber sicherstellen, dass alle Buchstaben in der endgültigen Liste unique sind.

Beispiel: "aaabcabccd""abcd"

Jetzt habe ich natürlich zwei Lösungen im Kopf. Eine verwendet eine list, die die Zeichen mit ihren ASCII - Codes abbildet. Immer wenn ich auf einen Buchstaben stoße, wird der Index auf True gesetzt. Danach werde ich die Liste scannen und alle eingestellten anhängen. Es wird eine zeitliche Komplexität von O(n) haben.

Eine andere Lösung wäre die Verwendung einer dict und das gleiche Verfahren. Nach der Zuordnung aller Zeichen führe ich die Operation für jeden Schlüssel im Wörterbuch durch. Dies wird auch eine lineare Laufzeit haben.

Da ich ein Python-Neuling bin, habe ich mich gefragt, was platzsparender wäre. Welches könnte effizienter implementiert werden?

PS: Reihenfolge istnichtwichtig beim Erstellen der Liste.

29
Ali

Die einfachste Lösung ist wahrscheinlich:

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

Beachten Sie, dass dies nicht die Reihenfolge garantiert, in der die Buchstaben in der Ausgabe angezeigt werden, auch wenn das Beispiel etwas anderes vermuten lässt.

Sie bezeichnen die Ausgabe als "Liste". Wenn eine Liste das ist, was Sie wirklich wollen, ersetzen Sie ''.join durch list:

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

In Bezug auf die Leistung klingt die Besorgnis in dieser Phase nach verfrühter Optimierung.

67
NPE

Verwenden Sie ein OrderedDict . Dadurch wird sichergestellt, dass die Bestellung erhalten bleibt

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

PS: Ich habe gerade die OrderedDict- und die Set-Lösung zeitlich festgelegt, und die spätere ist schneller. Wenn Ordnung keine Rolle spielt, sollte Satz die natürliche Lösung sein, wenn es um Ordnung geht; so sollten Sie es tun.

>>> 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
15
Abhijit

Der Vollständigkeit halber folgt ein weiteres Rezept, das die Buchstaben als Nebenprodukt ihrer Funktionsweise sortiert:

>>> from itertools import groupby
>>> ''.join(k for k, g in groupby(sorted("aaabcabccd")))
'abcd'
2
martineau

wenn das Ergebnis nicht auftragserhaltend sein muss, können Sie einfach einen Satz verwenden

>>> ''.join(set( "aaabcabccd"))
'acbd'
>>>
1
gefei

Ich habe eine Idee. Warum nicht die Konstante ascii_lowercase verwenden?

Führen Sie beispielsweise den folgenden Code aus:

# 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)

Druckt 'abcd'

Los geht's, alle Duplikate werden entfernt und optional sortiert

0
Brent Pappas

Speichern Sie eindeutige Zeichen in der Liste

Methode 1:

uniue_char = list(set('aaabcabccd'))
#['a', 'b', 'c', 'd']

Methode 2: Durch Schleife (komplex)

uniue_char = []
for c in 'aaabcabccd':
    if not c in uniue_char:
        uniue_char.append(c)
print(uniue_char)
#['a', 'b', 'c', 'd']
0
Dipen Parmar