如何编写条件列表理解,具有“扩展”功能

时间:2013-12-18 23:04:36

标签: python list list-comprehension

我想用“扩展功能”编写一个很好的单行列表解析,其中还包括一个条件。这就是我的工作原理

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来说是个不错的选择。

4 个答案:

答案 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') ],[])

虽然它的速度较慢......