我想用“扩展功能”编写一个很好的单行列表解析,其中还包括一个条件。这就是我的工作原理
nouns = []
[nouns.extend(value)/ for key, value in pos_dictionary.iteritems()
if key.startswith('NN') ]
理想情况下,我写的东西很像
nouns = [nouns.extend(value) for key, value in pos_dictionary.iteritems()
if key.startswith('NN') ]
哪个不起作用,因为我还没有定义列表。前者并不是非常可怕,基本上使用理解作为功能List.iter语句。虽然我是python的新手,但这似乎仍然不是正确的风格。如果这是正确的风格,我将不胜感激。
我遇到了这个场景,因为我希望将所有不同类型的名词标签从POS标签器(使用NLTK)聚合到一个列表中。
编辑:我同意这几乎是重复的,我不认为这是否会使列表变得扁平化,但现在它已被引入作为一种可能性我可以接受它。一个变体是我的例子在理解中包括条件。此外,我正在询问首选的惯用语法,虽然可能是开放式的,但对于新手到python来说是个不错的选择。
答案 0 :(得分:3)
单一列表理解并非一切都做得最好。虽然你可以做到
nouns = [x for key, value in pos_dictionary.iteritems() if key.startswith('NN') for x in value]
我真的认为
nouns = []
for key, value in pos_dictionary.iteritems():
if key.startswith('NN'):
nouns += value
更加灵活。
答案 1 :(得分:2)
您可以使用itertools.chain.from_iterable()
拼接一系列列表:
from itertools import chain
nouns = list(chain.from_iterable(value
for key, value in pos_dictionary.iteritems()
if key.startswith('NN')))
答案 2 :(得分:1)
如果您基本上想要运行多个列表推导,这些列表推导都会对同一个最终列表产生影响,那么您可以创建单独的列表推导,例如正常,然后简单地连接列表。
例如:
nouns1 = [value for key, value in pos_dictionary.iteritems() if key.startswith('NN')]
nouns2 = [value for somethingElse]
nouns3 = [value for andOneMore]
nouns = nouns1 + nouns2 + nouns3
答案 3 :(得分:0)
sum([value for key, value in pos_dictionary.iteritems() if key.startswith('NN') ],[])
虽然它的速度较慢......