我正在检查字典中单词的切片部分是否在列表中,因此我可以知道单词是否以“;”结尾或者是字典值的最后一个是基本形式的名词。
我这里有这个代码:
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 :(得分:2)
你问pythonic。在我看来,这是使用python提供的功能的最pythonic方法。
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):
...
这样你就不必以不同的方式处理两个和三个字母的结尾。