2017-01-20 3 views
2

辞書の単語のスライスされた部分がリストに含まれているかどうかを確認しているので、「;」で終わる単語または辞書値の最後のものは、基本形式の名詞です。これを書くにはもっとpythonic/betterな方法がありますか?

私はここにこのコードを持っている:

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) 

それは動作しますが、それは一種のハードコードされています。私はどうにかして症例/結末のためにただ1つのリストを使用することを好むでしょう。

+0

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) 

か:あなたが望んでいたが、同様に「神託」アプローチがどのように見えるかの例を与えることを何おそらくではありません

同義語の区切りリストアイテムのリストを格納するためのより良い方法は、よく、リスト(またはおそらくセット)です。 – ThisSuitIsBlackNot

答えて

1

代わりの

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

あなたは言葉は、あなたが終末オーバーセミコロンやループを取り除くことができ、あなたのリストの中語尾の一つを有するかどうかを確認するには

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

を使用することができます。

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

このように、2文字と3文字のエンディングを別々に扱う必要はありません。

2

パイソンについてお尋ねします。私の意見では、Pythonで提供されている機能を使用するための最も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]) 
#     ^^^^^^^^^^^^^^^^^^^^^ 

正確に何をしようとする話して

。これはxv.split()[i]v.split()[-1]に比較していますか?私は条件が少なくともコメントを正当化すると思う。文字列全体の最後の部分文字列であるかどうかを調べることはなぜ重要ですか?辞書セミコロンで値をです

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) 
関連する問題