簡體   English   中英

在Python中將多維列表轉換為1D列表

[英]Convert multi-dimensional list to a 1D list in Python

l=[[1,2],[3,4]]這樣的多維列表可以通過sum(l,[])轉換為1D。 任何人都可以解釋一下這是怎么回事?

響應者說,這種技術只能用於“壓扁”2D列表 - 它不適用於更高的多維列表。 但如果重復,它確實如此。 例如,如果A是3D列表,則sum(sum(A),[]),[])將A壓縮為1D列表。

如果您所說的nested列表是“2D”(意味着您只想向下一級,並且nested所有1級向下項目都是列表),那么簡單的列表理解:

flat = [x for sublist in nested for x in sublist]

是我推薦的方法 - 比sum更有效( sum是用於數字 - 以某種方式讓它阻止所有“加”非數字的嘗試太麻煩了...我是Python標准庫中最初的提議者和sum第一個實現者,所以我想我應該知道;-)。

如果你想“盡可能深入”(對於深度嵌套的列表),遞歸是最簡單的方法,盡管通過消除遞歸可以獲得更高的性能(以更高的復雜性為代價)。

這個方法提出了一個遞歸解決方案,一個遞歸消除和其他方法(所有這些方法都很有用,但沒有一個像我在本回答中提到的單線程一樣簡單)。

sum使用+運算符將序列加在一起。 例如sum([1,2,3]) == 6 第二個參數是一個可選的起始值,默認為0.例如sum([1,2,3], 10) == 16

在你的例子中它有[] + [1,2] + [3,4] ,其中+ 2個列表將它們連接在一起。 因此結果是[1,2,3,4]

需要空列表作為sum的第2個參數,因為如上所述,默認值是將sum加到0(即0 + [1,2] + [3,4] ),這將導致不支持的操作數類型( s)for +:'int'和'list'

這是sum幫助的相關部分:

sum(sequence [,start]) - > value

返回一系列數字(非字符串)加上參數'start'的值(默認為0)。

注意

正如wallacoloo所述,這不是用於展平任何多維列表的一般解決方案。 由於上述行為,它僅適用於1D列表的列表。

更新

有關展平1級嵌套的方法,請參閱itertools頁面中的此配方:

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)

要展平更深層次的嵌套列表(包括不規則嵌套列表),請參閱此問題的已接受答案 (還有一些與該問題本身相關的其他問題。)

請注意,配方返回一個itertools.chain對象(可迭代),另一個問題的答案返回一個generator對象,因此如果您想要完整列表而不是迭代它,則需要將其中任何一個包裝在list調用中。 例如list(flatten(my_list_of_lists))

在我看來,更像是在尋找最終答案:

[3, 7]

為此,你最好有一個列表理解

>>> l=[[1,2],[3,4]]
>>> [x+y for x,y in l]
[3, 7]

對於任何類型的多元數組,此代碼將展平為一個維度:

def flatten(l):
    try:
        return flatten(l[0]) + (flatten(l[1:]) if len(l) > 1 else []) if type(l) is list else [l]
    except IndexError:
        return []

我寫了一個程序來使用遞歸進行多維展平。 如果有人對改進程序有任何意見,你總能看到我微笑:

def flatten(l):
    lf=[]
    li=[]
    ll=[]
    p=0
    for i in l:
        if type(i).__name__=='list':
           li.append(i)
        else:
           lf.append(i)
    ll=[x for i in li for x in i]
    lf.extend(ll)

    for i in lf:
        if type(i).__name__ =='list':
           #not completely flattened
           flatten(lf)
        else:
           p=p+1
           continue

    if p==len(lf):
       print(lf)

+運算符連接列表,起始值為[]空列表。

我寫過這個函數:

def make_array_single_dimension(l):
    l2 = []

    for x in l:
        if type(x).__name__ == "list":
            l2 += make_array_single_dimension(x)
        else:
            l2.append(x)

    return l2

它也有效!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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