2017-01-20 4 views
2

Ich überprüfe, ob der aufgeschnittene Teil der Wörter im Wörterbuch in der Liste ist, damit ich wissen kann, ob Wörter mit ";" oder sind zuletzt im Wörterbuchwert Nomen in Grundform.Mehr pythonischer/besserer Weg dies zu schreiben?

Ich habe diesen Code hier:

dict = {"devotion": "andumus; pühendumust", "devotional": "vagasse", 
     "devour": "kugistama; alla neelama", "devoured": "neelatud"} 
endings2 = ["es", "te", "de", "st", "el", "le", "lt", "ks", "ni", "na", "ta", "ga", "id"] 
endings3 = ["sse", "tte"] 

for k, v in sorted(dict.items()): 
    for x in v.split(): 
     if ((x[-1:] == ';' or x == v.split()[-1]) 
      and (x[-3:-1] not in endings2 and x[-4:-1] not in endings3 
       and x[-2:] not in endings2 and x[-3:] not in endings3)): 
      print(k, x) 

Es funktioniert, aber es ist eine Art von Hardcoded. Ich würde es vorziehen, irgendwie nur eine Liste für die Fälle/Enden zu verwenden.

+0

die Werte in Ihrem Wörterbuch semi-Dickdarm- Sind getrennte Synonymlisten? Eine bessere Möglichkeit, eine Liste von Elementen zu speichern, ist eine Liste (oder vielleicht ein Set). – ThisSuitIsBlackNot

Antwort

1

Statt

if x[-1] == ";" ... 

könnten Sie

if x.endswith(';') ... 

verwenden, um festzustellen, ob ein Wort einer der Endungen in der Liste hat Sie das Semikolon und Schleife über die Endungen Streifen könnte:

word = x.strip(';') 
for ending in endings: 
    if word.endswith(ending): 
    ... 

auf diese Weise müssen Sie nicht anders Endungen von zwei und drei Buchstaben zu behandeln.

2

Sie fragen nach Pythonic. Meiner Meinung nach ist der pythischste Ansatz, um die Funktionen von Python zu verwenden.

str.endswith

str.endswith (Suffix [, Start [, end]])

Return True, wenn die Zeichenfolge mit dem angegebenen Suffix endet, ansonsten Falsch zurück. Suffix kann auch ein Tupel von Suffixen sein, nach denen gesucht werden soll. Mit optionalem Start beginnt der Test an dieser Position. Mit optionalem Ende den Vergleich an dieser Stelle stoppen.

Geändert in Version 2.5: Tupel als Suffix akzeptieren.

So nimmt es ein tuple, warum das nicht verwenden:

endings = tuple(endings2 + endings3) 

if not x.endswith(endings): 
    print(k, x) 

Statt any und ein Verständnis oder eine manuelle Schleife hier zu verwenden.


Aber es gibt eine andere pythonic Richtlinie (import this)

[...]

Einfach ist besser als kompliziert.

[...]

Es sollte one-- und vorzugsweise nur eine --obvious Art und Weise, es zu tun.

[...]

Ich bin über

if (x[-1:] == ';' or x == v.split()[-1]) 
#     ^^^^^^^^^^^^^^^^^^^^^ 

sprechen was genau Sie zu tun versuchen.Dies vergleicht Ihre x welche ist v.split()[i] zu v.split()[-1]? Ich denke, dass diese Bedingung zumindest einen Kommentar rechtfertigt. Warum ist es wichtig zu überprüfen, ob es die letzte Teilzeichenfolge in der gesamten Zeichenfolge ist?

Das ist wahrscheinlich nicht das, was Sie wollten, aber ein Beispiel geben, wie ein „pythonic“ Ansatz aussehen könnte:

for k, v in sorted(dict.items()): 
    for x in v.split(';'):   # split at ';' 
     x = x.strip()    # remove leading and trailing whitespaces 
     if not x.endswith(endings): # make sure it doesn't end with a forbidden ending 
      print(k, x) 

oder:

for k, v in sorted(dict.items()): 
    for x in v.split():    # split at whitespaces 
     x = x.rstrip(';')   # remove TRAILING ";" 
     if not x.endswith(endings): 
      print(k, x) 
Verwandte Themen