假设我有一个
同样的事情发生了!为什么?如果我再增加一个守卫:
dict
(字典):d = {'AA': 'BB', 'BB': None}
还有这个 for comprehension
:
[v for t in u'{}'.format(v.lower()) for k, v in d.items()]
很明显会失败,原因是'NoneType'对象没有'lower'属性,让我们试试这个:
[v for t in u'{}'.format(v.lower()) for k, v in d.items() if v is not None]
同样的事情发生了!为什么?如果我再增加一个守卫:
[v for t in u'{}'.format(v.lower()) if v is not None for k, v in d.items() if v is not None]
同样的事情。
为什么即使有保护条件,v.lower()
也会被调用?
然而,这个方法可以正常工作:
for k,v in d.items():
if v is not None:
[v for t in u'{}'.format(v.lower())]
更新
这是实际引起问题的代码。上面的代码是为了简化示例,但考虑到下面提供的答案,我想发表实际代码:
x = {'A': 'This is a Line to Be tokenized'}
for k,v in x.items():
if v is not None:
pat = [{'LOWER': str(t)} for t in tokenizer(u'{}'.format(v.lower()))]
这将生成Spacy的模式,格式如下:
[{'LOWER': 'this'},
{'LOWER': 'is'},
{'LOWER': 'a'},
{'LOWER': 'line'},
{'LOWER': 'to'},
{'LOWER': 'be'},
{'LOWER': 'tokenized'}]
所以,我原本用的for循环推导式生成那个输出是:
[{'LOWER': str(t)} for k, v in x.items() if v is not None for t in tokenizer(u'{}'.format(v))]
但是,如上所述,当字典的value
为None
时,即使提供了guard
,也会失败。
更新2
这里有更多例子:
x = {'A': 'This is a Line to Be tokenized', 'B': 'Hello'}
for k,v in x.items():
if v is not None:
pat = [{'LOWER': str(t)} for t in tokenizer(u'{}'.format(v.lower()))]
print(pat)
# [{'LOWER': 'this'}, {'LOWER': 'is'}, {'LOWER': 'a'}, {'LOWER': 'line'}, {'LOWER': 'to'}, {'LOWER': 'be'}, {'LOWER': 'tokenized'}]
# [{'LOWER': 'hello'}]
基本上我想将那个循环转换为一个推导式。
[v.lower() if v is not None else v for k, v in d.items()]
? - Rakesh[v.lower() if v else v for k, v in d.items()]
也不需要为每个字符调用str.lower
... 为什么不是整个字符串呢? - yatu