让我们说我有一个dict
:
d = {'AA': 'BB', 'BB': None}
还有这个for comprehension
:
[v for t in u'{}'.format(v.lower()) for k, v in d.items()]
很明显,它会因'NoneType' object has no attribute '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'}]
所以,最初我对生成该输出的理解是
[{'LOWER': str(t)} for k, v in x.items() if v is not None for t in tokenizer(u'{}'.format(v))]
但是,如上所述,当字典的value
为None
时,即使提供了guard
,字典也会失败。
还有更多示例:
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'}]
所以,基本上,我想将该循环转换为理解力。
答案 0 :(得分:3)
您需要更改for
和if
的顺序:
>>> [v for k, v in d.items() if v is not None for t in u'{}'.format(v.lower())]
['BB', 'BB']
>>>
if
语句必须位于会引起错误的位置之前。
第二个for
循环必须在for
循环之后,该循环包含第二个for
循环使用的迭代器。
答案 1 :(得分:1)
可以这样写:
x = {'A': 'This is a Line to Be tokenized', 'B':None}
for k,v in x.items():
if v is not None:
pat = [{'LOWER': str(t)} for t in tokenizer(u'{}'.format(v.lower()))]
res = [[{'LOWER': str(t)} for t in tokenizer(u'{}'.format(v.lower()))] for k, v in x.items() if v is not None]
输出:
[[{'LOWER': 'this'},
{'LOWER': 'is'},
{'LOWER': 'a'},
{'LOWER': 'line'},
{'LOWER': 'to'},
{'LOWER': 'be'},
{'LOWER': 'tokenized'}]]
但是,在这一点上,单行编写并没有带来什么好处,但是在可读性方面却损失了很多。我鼓励您不要将其写成一行。