2016-03-28 6 views
4

Ich versuche, die Wörter einer Zeichenfolge auf eine bestimmte Weise zu bestellen: In meinem Code unter der Ausgabe ist "MNWdeorwy" aber ich würde mag es zu sein "deMNorWwy" (also muss ich die Briefe behalten, obwohl sie obere o Kleinbuchstaben sind) Könnten Sie mir bitte helfen zu verstehen, wo ich falsch liege und warum? DankePython: Wie sortiere ich die Buchstaben in einer Zeichenfolge alphabetisch unter Unterscheidung zwischen Groß- und Kleinbuchstaben

wrd = "MyNewWord" 

def order_word(s): 
    if s == "": 
     return "Invalid String!" 
    else: 
     c = sorted(s) 
     d = ''.join(sorted(c)) 
     return d 

print order_word(wrd) 

ich genau möchte, dass meine Frage aus der folgenden unterscheidet: How to sort the letters in a string alphabetically in Python: In der Tat, da die Antworten in der Verbindung berücksichtigt nicht den Unterschied zwischen Groß- und Kleinbuchstaben in einem String.

+2

Es ist kein Duplikat ist, weil diese Frage nicht die Unterscheidung zwischen Groß- und Kleinbuchstaben in Betracht ziehen. –

+0

Sorry Rad, vielleicht meine Schuld, aber ich habe versucht, den ganzen Code in dieser Antwort zu verwenden, um die Zeichenfolge "MyNewWord" zu sortieren und ohne Erfolg die Ausgabe "deMNorWwy" zu erhalten: Könnten Sie mir sagen, welcher Code in dieser Antwort enthalten ist gibt mir die Ausgabe, nach der ich suche? Danke –

+0

Entschuldigung - Ich dachte, dass es alle Möglichkeiten aufgelistet, aber Ihre Anforderung ist nicht drin. Es tut uns leid! (Gut, die vorherige Frage zu erwähnen.) – usr2564301

Antwort

9

sorted() Sortierungen basierend auf der Ordinalzahl jedes Zeichens. Großbuchstaben haben Ordnungszahlen, die niedriger sind als alle Kleinbuchstaben. Wenn Sie ein anderes Verhalten wollen, müssen Sie Ihren eigenen Schlüssel definieren:

c = sorted(s, key=lambda c: (c.lower(), c.islower())) 

Auf diese Weise c würde durch ('c', 1) sortiert werden und C durch ('c', 0) sortiert. Beide kommen vor ('d', ...) oder ('e', ...) usw., aber die Hauptstadt C ist früher (niedriger) als der Kleinbuchstabe c.

Übrigens sollten Sie nicht d = "".join(sorted(c)) sagen, weil c bereits sortiert wurde. Just do d = "".join(c)

+0

Danke zondo, aber ich habe versucht, d = '' .join (sortiert (c)) mit d = "" .join (c) aber die Ausgabe ist die gleiche "MNWdeorwy" .. –

+0

Nur wenn Sie Ihren Code verwenden für 'c', oder? Mein Code funktioniert auf meinem Computer großartig. – zondo

+0

Das ist sehr hilfreich und funktioniert für mich. Aber kannst du bitte erklären, warum du key = lambda c: (c.lower, c.islower()) angegeben hast? – codeAligned

1

Sie können auch wie versuchen, diese

import re 

def natural_sort(wrd): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    final = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    return ''.join(sorted(wrd, key = final)) 

Ausgang:

>>> natural_sort(wrd) 
'deMNorwWy' 

ODER

Sie mit Drittanbieter-Bibliothek für diese auf PyPI tun können genannt natsort

https://pypi.python.org/pypi/natsort

2

Wenn ich richtig Ihre Anforderungen verstehen, wollen Sie

  1. eine Zeichenfolge sortieren, ohne den Fall von Buchstaben
  2. als zu ändern, wenn alle Buchstaben haben den gleichen Fall

dies kann sein erreicht, zum Beispiel

In [44]: a = 'zWea' 

In [45]: sorted(a,key=lambda c:c.upper()) 
Out[45]: ['a', 'e', 'W', 'z'] 

In [46]: 

, weil Sie einen Moment verwandeln arbeitet einzelne Zeichen während eines Vergleichs.

Vergessen zu erwähnen, dass Sie nicht-alphabetische Zeichen in Ihrer Zeichenfolge mischen können, aber ein paar Zeichen werden zwischen Groß- und Kleinbuchstaben gesetzt (z., Die ^ caret), so, was man bekommt, hängt von .lower() oder .upper() Methode von Strings,

In [56]: sorted('abCD^',key=lambda c:c.lower()) 
Out[56]: ['^', 'a', 'b', 'C', 'D'] 

In [57]: sorted('abCD^',key=lambda c:c.upper()) 
Out[57]: ['a', 'b', 'C', 'D', '^'] 

In [58]: 
Verwandte Themen