我有一个嵌套列表与列表和数字混合。
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]
答案 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