编写列表解析以展平嵌套列表

时间:2017-06-07 15:51:18

标签: python list python-3.x list-comprehension

我有一个嵌套列表与列表和数字混合。

nested = [[1, 2, 3], [4, 5, 6], [7, 8], [9], 10, 11]

嵌套列表只包含数字,它们永远不会包含更多列表。

是否可以编写列表推导来从“嵌套”列表中创建新列表?列表,产生以下输出?

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

这是我的尝试(代码无效)

[num if isinstance(item, list) for num in item else item for item in nested]

2 个答案:

答案 0 :(得分:5)

您需要将实例测试放在循环中,以便从嵌套列表中提取元素:

public String appendCSV(Map featureset) throws IOException{
    StringBuilder csvReport = new StringBuilder(); 

    Map<String, Integer> map =featureset;
    Set<String> keys = map.keySet();

    String[] lsitofkeys = {};

    for(String elements:keys){
        for(int i =0 ; i< keys.size(); i++){
             csvReport.append(elements+",");
        }
        csvReport.append("\n");
        for(String key: keys){
            csvReport.append(map.get(key).toString()+",");
        }
    }

  return csvReport.toString();
}

演示:

[num for item in nested for num in (item if isinstance(item, list) else (item,))]

如果您首先将其表示为一组>>> nested = nested = [[1, 2, 3], [4, 5, 6], [7, 8], [9], 10, 11] >>> [num for item in nested for num in (item if isinstance(item, list) else (item,))] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 循环,则会有所帮助;你的尝试基本上是这样做的:

for

这不是真正有效的Python。

我上面的列表理解反而是:

for item in nested:
    _element = num if isinstance(item, list) for num in item else item
    result.append(_element)

答案 1 :(得分:1)

如果你的列表有任意嵌套,最好使用递归函数(referring to one of my other answers):

>>> def flat_gen(x):
...     def iselement(e):
...         return not(isinstance(e, collections.Iterable) and not isinstance(e, str))
...     for el in x:
...         if iselement(el):
...             yield el
...         else:
...             yield from flat_gen(el)   
... 
>>> nested = [[1,2,3] , [4,5,6] , [7,8] , [9,] , 10 , 11 ]

>>> import collections
>>> list(flat_gen(nested))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

如果您只是在简单列表或元组(任何可迭代容器)和非列表或元组对象(即,不可迭代的对象和没有更深嵌套的可迭代容器)之间进行混合嵌套,则可以使用带{{的生成器表达式1}}:

list