更多pythonic /更好的方式来写这个?

时间:2017-01-20 16:23:00

标签: python python-3.x

我正在检查字典中单词的切片部分是否在列表中,因此我可以知道单词是否以“;”结尾或者是字典值的最后一个是基本形式的名词。

我这里有这个代码:

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)

它有效,但它有点硬编码。我宁愿以某种方式只使用一个列表来表示案例/结尾。

2 个答案:

答案 0 :(得分:2)

你问pythonic。在我看来,这是使用python提供的功能的最pythonic方法。

str.endswith

  

str.endswith(suffix [,start [,end]])

     

如果字符串以指定的后缀结束,则返回True,否则返回False。后缀也可以是要查找的后缀元组。通过可选的启动,从该位置开始测试。使用可选结束,停止在该位置进行比较。

     

在版本2.5中更改:接受元组作为后缀。

所以它接受tuple,为什么不使用它:

endings = tuple(endings2 + endings3)

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

而不是在这里使用any和理解或手动循环。

但还有另一个pythonic指南(import this

  

[...]

     

简单比复杂更好。

     

[...]

     

应该有一个 - 最好只有一个 - 显而易见的方法。

     

[...]

我说的是

if (x[-1:] == ';' or x == v.split()[-1])
#                 ^^^^^^^^^^^^^^^^^^^^^
你究竟想做什么。这会将x v.split()[i]v.split()[-1]进行比较?我认为这种情况至少可以证明一个评论。为什么检查它是否是整个字符串中的最后一个子字符串很重要?

这可能不是你想要的,而是举例说明“pythonic”方法的样子:

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)

答案 1 :(得分:1)

而不是

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

你可以使用

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

要查看某个单词是否在列表中有一个结尾,您可以删除分号并循环结束:

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

这样你就不必以不同的方式处理两个和三个字母的结尾。