2017-01-20 4 views
2

Я проверяю, есть ли нарезанная часть слов в словаре, поэтому я могу знать, если слова, которые заканчиваются на «;», или являются последними в словарном значении, являются существительными в базовой форме.Подробнее pythonic/лучший способ написать это?

У меня есть этот код здесь:

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) 

Это работает, но это своего рода жёстко. Я бы предпочел как-то использовать только один список для случаев/окончаний.

+0

ли значения в вашем словаре полу-разделённых двоеточием разделенные списки синонимов? Лучший способ хранения списка элементов - это список (или, может быть, набор). – ThisSuitIsBlackNot

ответ

1

Вместо

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

вы могли бы использовать

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

Чтобы увидеть, если слово имеет одно из окончаний в списке можно обирать запятой и петлю на окончаниях:

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

Таким образом, вы не должны обрабатывать окончания двух и трех букв по-разному.

2

Вы спрашиваете о pythonic. На мой взгляд, это самый пифонический подход к использованию функций, предоставляемых python.

str.endswith

str.endswith (суффикс [, начало [, конец]])

Возвращает True, если строка заканчивается указанным суффиксом, в противном случае возвращает значение False. суффикс также может быть кортежем суффиксов для поиска. С дополнительным запуском начните тестирование с этой позиции. С дополнительным концом прекратите сравнивать в этом положении.

Изменено в версии 2.5: Принимать кортежи как суффикс.

Так что принимает tuple, почему бы не использовать это:

endings = tuple(endings2 + endings3) 

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

Вместо использования any и понимания или ручного цикла здесь.


Но есть еще один вещий ориентир (import this)

[...]

Простой лучше, чем сложнее.

[...]

Там должно быть одно-- и предпочтительно только один --obvious способ сделать это.

[...]

Я говорю о

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

, что именно вы пытаетесь сделать.Это сравнивается с x, которое составляет v.split()[i], по адресу v.split()[-1]? Я думаю, что условие, по крайней мере, оправдывает комментарий. Почему важно проверить, является ли это последней подстрокой во всей строке?

Это, вероятно, не то, что вы хотели, но, чтобы дать пример того, как «вещий» подход может выглядеть как:

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) 

или:

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) 
Смежные вопросы