我有一个代码块,它给我一个列表,其中包含一些三重嵌套列表:
my_list = [[['item1','item2']], [['item3', 'item4']]]
我想成功:
my_list = [['item1','item2'], ['item3', 'item4']]
有什么建议吗?
答案 0 :(得分:24)
使用列表推导从每个子列表中选择单个子子列表:
>>> 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倍的减速,这根本不是一个很长的列表。对于更长的名单,情况会更糟。
答案 1 :(得分:14)
执行以下操作:
my_list = [j for i in my_list for j in i ]
答案 2 :(得分:12)
一种简单但有效的方法是使用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']]
对于大小为O(n)
的列表,其复杂度为n
。
答案 3 :(得分:6)
my_list = list(map(lambda x :x[0], my_list))
答案 4 :(得分:6)
my_list = [[['item1','item2']],[['item3', 'item4']]]
list comprehension
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']]
>>>
答案 5 :(得分:1)
map
和operator.itemgetter
:
map(operator.itemgetter(0), my_list)
在Python 3中返回一个生成器。如果需要list
在list(...)
调用中包装生成器。
答案 6 :(得分:0)
如果您想快速解决问题,就像这样简单 -
for i in range(len(my_list)):
my_list[i]=my_list[i][0]
答案 7 :(得分:0)
python3
[[x], [y]] = my_list
print([x , y])
[['item1', 'item2'], ['item3', 'item4']]
答案 8 :(得分:0)
快速修复,只要你有嵌套列表的类似结构,下面的递归函数(或类似的其他情况)可以处理任何级别的嵌套。没有测量性能,但与其他解决方案相比,它会更少。使用前测好。在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']]
hasattr()检查将跳过python 2中的字符串。像iter()这样的其他测试可能会将字符串视为可迭代的