gpt4 book ai didi

python - 列表理解守卫被忽略

转载 作者:太空狗 更新时间:2023-10-30 02:51:17 25 4
gpt4 key购买 nike

假设我有一个dict:

d = {'AA': 'BB', 'BB': None}

而这个为了理解:

[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() 甚至被 guard 调用?

但是,这是可行的:

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))]

但是,如上所述,当字典的 valueNone 时,即使提供了 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'}]

所以,基本上我想将该循环转换为理解。

最佳答案

您需要更改 forif 的顺序:

>>> [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 循环之后。

关于python - 列表理解守卫被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com