列表理解卫队被忽略

时间:2019-06-06 08:57:55

标签: python list-comprehension spacy

让我们说我有一个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))]

但是,如上所述,当字典的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'}]

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

2 个答案:

答案 0 :(得分:3)

您需要更改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循环使用的迭代器。

答案 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'}]]

但是,在这一点上,单行编写并没有带来什么好处,但是在可读性方面却损失了很多。我鼓励您不要将其写成一行。