簡體   English   中英

三重嵌套列出了Python

[英]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 comprehensionlist 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']]
>>> 

使用mapoperator.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM