Anu*_*rma 13 python list-comprehension list python-2.7
我试图在python中使用list comprehension来压缩列表.我的名单有点像
[[1, 2, 3], [4, 5, 6], 7, 8]
Run Code Online (Sandbox Code Playgroud)
只是为了打印这个列表中的单个项目我写了这段代码
def flat(listoflist):
for item in listoflist:
if type(item) != list:
print item
else:
for num in item:
print num
>>> flat(list1)
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)
然后我使用相同的逻辑通过列表理解展平我的列表我得到以下错误
list2 = [item if type(item) != list else num for num in item for item in list1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)
如何使用列表理解来展平这种类型的列表?
Gre*_*ade 12
没有人给出通常的答案:
def flat(l):
return [y for x in l for y in x]
Run Code Online (Sandbox Code Playgroud)
StackOverflow周围有这个问题的愚蠢.
Ash*_*ary 10
>>> from collections import Iterable
>>> from itertools import chain
Run Code Online (Sandbox Code Playgroud)
一内胆:
>>> list(chain.from_iterable(item if isinstance(item,Iterable) and
not isinstance(item, basestring) else [item] for item in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
可读版本:
>>> def func(x): #use `str` in py3.x
... if isinstance(x, Iterable) and not isinstance(x, basestring):
... return x
... return [x]
...
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
#works for strings as well
>>> lis = [[1, 2, 3], [4, 5, 6], 7, 8, "foobar"]
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']
Run Code Online (Sandbox Code Playgroud)
使用嵌套列表理解:(比较慢itertools.chain):
>>> [ele for item in (func(x) for x in lis) for ele in item]
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5180 次 |
| 最近记录: |