我有一段代码,它给了我一个列表,其中包含一些三重嵌套的列表:
my_list = [[['item1','item2']], [['item3', 'item4']]]
我希望你能够将其改为:
my_list = [['item1','item2'], ['item3', 'item4']]
有什么建议吗?
使用列表推导式从每个子列表中选择单个子子列表:
>>> my_list = [item[0] for item in my_list]
[['item1', 'item2'], ['item3', 'item4']]
使用sum
函数也可以将嵌套级别压缩到一起,但这会导致性能灾难,因为它的运行时间是二次方级别的:
In [5]: my_list = [[[i, i+1]] for i in range(0, 10000, 2)]
In [6]: %timeit sum(my_list, [])
78.6 ms ± 2.15 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [7]: %timeit [x[0] for x in my_list]
187 µs ± 3.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [8]: 78600/187
Out[8]: 420.32085561497325
对于一个长度为5000的my_list
来说,这是一个420倍的减速,而这并不是一个非常长的列表。对于更长的列表来说,情况甚至更糟。
item
有多个元素时删除数据,并在item
为空时引发错误。 - Eric Duminil执行以下操作:
my_list = [j for i in my_list for j in i ]
for循环
实现:[i[0] for i in my_list]
。 - srikavineeharii
有多个元素,并且如果i
为空,也不会引发错误。 - Eric Duminillist
去做了 :) - srikavineehari一个简单但高效的方法是使用itertools.chain.from_iterable
将您的三层嵌套列表展开:
>>> import itertools
>>> my_list = [[['item1','item2']],[['item3','item4']]]
>>> my_list = list(itertools.chain.from_iterable(my_list))
>>> my_list
[['item1', 'item2'], ['item3', 'item4']]
对于一个长度为n
的列表,时间复杂度为O(n)
。
my_list = list(map(lambda x :x[0], my_list))
my_list = [[['item1','item2']],[['item3', 'item4']]]
使用列表推导式
的一行代码
my_list = [sub[0] for sub in my_list]
你也可以原地更改 my_list
:
my_list = [[['item1','item2']],[['item3', 'item4']]]
for i, sub in enumerate(my_list):
my_list[i] = sub[0]
>>> my_list
[['item1', 'item2'], ['item3', 'item4']]
>>>
map
和 operator.itemgetter
:map(operator.itemgetter(0), my_list)
list
,请将生成器包装在list(...)
中。如果你想要快速解决问题,这很简单 -
for i in range(len(my_list)):
my_list[i]=my_list[i][0]
Python3
[[x], [y]] = my_list
print([x , y])
[['item1', 'item2'], ['item3', 'item4']]
一个快速修复,只要您具有嵌套列表的类似结构,下面的递归函数(或其他情况下的类似函数)就可以处理任何级别的嵌套。没有测量性能,但与其他解决方案相比,它将更少。使用之前请进行充分测试。在Python 2.7中。
def f(x):
if hasattr(x[0], '__iter__'):
return f(x[0])
else:
return x
>>> my_list = [[['item1','item2']], [['item3', 'item4']]]
>>> [f(elem) for elem in my_list]
[['item1', 'item2'], ['item3', 'item4']]
>>> my_list = [[[['item1','item2']]], [['item3', 'item4']],[[[['item5', 'item6']]]]]
>>> [f(elem) for elem in my_list]
[['item1', 'item2'], ['item3', 'item4'], ['item5', 'item6']]
在Python 2中,hasattr()检查将跳过字符串。其他测试,如iter(),可能会将字符串视为可迭代的。
my_list = list(map(lambda x :x[0], my_list))
- Vasif[[['item1','item2']], [['item3', 'item4']]].flatten(1)
。公平地说,这种情况也会发生在两个方向上。 - Eric Duminil