[英]Triple nested lists Python
我有一個代碼塊,它給我一個列表,其中包含一些三重嵌套列表:
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倍的減速,這根本不是一個很長的列表。 對於更長的列表,情況更糟。
請執行下列操作:
my_list = [j for i in my_list for j in i ]
一種簡單但有效的方法是使用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']]]
單list comprehension
與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']]
>>>
使用map
和operator.itemgetter
:
map(operator.itemgetter(0), my_list)
在Python 3中返回一個生成器。 如果需要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']]
hasattr()檢查將跳過python 2中的字符串。像iter()這樣的其他測試可能會將字符串視為可迭代的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.