是一个简短的语法连接列表列表到一个单一的列表(或迭代器)在python?

例如,我有一个列表,如下所示,我想迭代a,b和c。

x = [["a","b"], ["c"]]

我能想到的最好的是如下。

result = []
[ result.extend(el) for el in x] 

for el in result:
  print el

当前回答

如果你只深入一层,一个嵌套的理解也可以:

>>> x = [["a","b"], ["c"]]
>>> [inner
...     for outer in x
...         for inner in outer]
['a', 'b', 'c']

在一行上,它变成:

>>> [j for i in x for j in i]
['a', 'b', 'c']

其他回答

对于无限嵌套的元素,这是递归工作的:

def iterFlatten(root):
    if isinstance(root, (list, tuple)):
        for element in root:
            for e in iterFlatten(element):
                yield e
    else:
        yield root

结果:

>>> b = [["a", ("b", "c")], "d"]
>>> list(iterFlatten(b))
['a', 'b', 'c', 'd']

I had a similar problem when I had to create a dictionary that contained the elements of an array and their count. The answer is relevant because, I flatten a list of lists, get the elements I need and then do a group and count. I used Python's map function to produce a tuple of element and it's count and groupby over the array. Note that the groupby takes the array element itself as the keyfunc. As a relatively new Python coder, I find it to me more easier to comprehend, while being Pythonic as well.

在我讨论代码之前,这里有一个我必须首先平化的数据示例:

{ "_id" : ObjectId("4fe3a90783157d765d000011"), "status" : [ "opencalais" ],
  "content_length" : 688, "open_calais_extract" : { "entities" : [
  {"type" :"Person","name" : "Iman Samdura","rel_score" : 0.223 }, 
  {"type" : "Company",  "name" : "Associated Press",    "rel_score" : 0.321 },          
  {"type" : "Country",  "name" : "Indonesia",   "rel_score" : 0.321 }, ... ]},
  "title" : "Indonesia Police Arrest Bali Bomb Planner", "time" : "06:42  ET",         
  "filename" : "021121bn.01", "month" : "November", "utctime" : 1037836800,
  "date" : "November 21, 2002", "news_type" : "bn", "day" : "21" }

是来自Mongo的查询结果。下面的代码将这样的列表集合平铺开来。

def flatten_list(items):
  return sorted([entity['name'] for entity in [entities for sublist in  
   [item['open_calais_extract']['entities'] for item in items] 
   for entities in sublist])

首先,我将提取所有的“实体”集合,然后对于每个实体集合,遍历字典并提取name属性。

遗憾的是,Python没有一个简单的方法来平展列表。试试这个:

def flatten(some_list):
    for element in some_list:
        if type(element) in (tuple, list):
            for item in flatten(element):
                yield item
        else:
            yield element

它将递归地将列表平展;你可以这样做

result = []
[ result.extend(el) for el in x] 

for el in flatten(result):
      print el

如果你需要一个列表,而不是一个生成器,使用list():

from itertools import chain
x = [["a","b"], ["c"]]
y = list(chain(*x))

如果你只深入一层,一个嵌套的理解也可以:

>>> x = [["a","b"], ["c"]]
>>> [inner
...     for outer in x
...         for inner in outer]
['a', 'b', 'c']

在一行上,它变成:

>>> [j for i in x for j in i]
['a', 'b', 'c']