亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

將不規(guī)則的Python多維數(shù)組拉平到一維的方法實現(xiàn)

 更新時間:2021年01月11日 11:04:59   作者:小小明(代碼實體)  
這篇文章主要介紹了將不規(guī)則的Python多維數(shù)組拉平到一維的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

原始需求:

例如有一個列表:

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

希望把它轉(zhuǎn)換成下面這種形式:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

其實這個非常簡單,我將分享三個一行式代碼來解決這個問題。

但如果是下面這種不規(guī)則的多維列表:

l = [[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]]

我們想將它拉平到一維列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

又該怎么實現(xiàn)呢?

文末將演示通過遞歸或棧來實現(xiàn)深度優(yōu)先遍歷策略從而解決這個問題。

使用numpy拉平數(shù)組

import numpy as np
np.array(l).flatten().tolist()

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

使用python拉平數(shù)組

使用numpy數(shù)組拉平數(shù)組,其實很受限,一旦列表內(nèi)部每個元素的長度不一致,numpy就不好使了:

l = [[1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11]]
np.array(l).flatten().tolist()

D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray

結(jié)果:

[[1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11]]

這時我們可以通過python的itertools來實現(xiàn)高效的操作:

import itertools
list(itertools.chain(*l))

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

當(dāng)然還有一種更高級的操作方法是直接使用sum函數(shù):

sum(l, [])

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

你可能一臉懵逼,為什么sum函數(shù)可以實現(xiàn)列表的拉平?下面我翻譯一下,這段代碼實際做了什么:

result = []
for i in l:
  result += i
result

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

將不規(guī)則多維數(shù)組拉平到1維

例如,對于下面這個復(fù)雜的列表:

l = [[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]]
l

結(jié)果:

[[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]]

這樣的列表,對于上面的方法來說已經(jīng)都不好使了,這個時候怎么辦呢?

當(dāng)然對于這種長度不長的列表,我們可以玩點小技巧:

list_str = str(l).replace("[", "").replace("]", "")
eval(f"[{list_str}]")

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

當(dāng)然,使用正則替換更佳:

import re
eval(re.sub("(?!^)\[|\](?!$)", "", str(l)))

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

原理就是先將這個列表轉(zhuǎn)成普通的字符串,再將所有的[]字符都去掉,再轉(zhuǎn)成單維列表的字符串形式之后,用eval函數(shù)進行解析。但這種方式在列表足夠長的時候顯然是不合適的,會出現(xiàn)效率低下的問題。

深度優(yōu)先遍歷策略拉平多維數(shù)組

下面我介紹一個正常的解決這個問題的辦法,那就是使用深度優(yōu)先遍歷策略來解決這個問題,當(dāng)然如果你對拉平的結(jié)果沒有順序的要求還可以使用廣度優(yōu)先遍歷的策略。

深度優(yōu)先遍歷策略,最簡單直接的思路是使用遞歸來實現(xiàn):

def flatten(items, result=[]):
  for item in items:
    if isinstance(item, list):
      flatten(item, result)
    else:
      result.append(item)


result = []
flatten(l, result)
result

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

雖然遞歸可能出現(xiàn)調(diào)用棧過多導(dǎo)致性能下降或程序掛掉,但Python可以借助生成器讓遞歸調(diào)用變成普通調(diào)用:

def flatten(items):
  for item in items:
    if isinstance(item, list):
      yield from flatten(item)
    else:
      yield item


result = [e for e in flatten(l)]
result

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

而如果我們想不使用遞歸或生成器類遞歸,可以直接借助一個棧來實現(xiàn)。

為了保證結(jié)果是原有的順序,我們把左端作為棧頂,而數(shù)組不適合刪除左端的數(shù)據(jù),所以可以使用deque來作為棧。

首先,我們需要將原列表轉(zhuǎn)換為deque,下面是處理代碼:

from collections import deque

stack = deque(l)
result = []
while len(stack) != 0:
  item = stack.popleft()
  if isinstance(item, list):
    for e in reversed(item):
      stack.appendleft(e)
  else:
    result.append(item)
result

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

如果我們將原列表作為一個右端為棧頂?shù)臈?,可以通過向結(jié)果左端插入數(shù)據(jù)來保持原有的順序:

from collections import deque

stack = l.copy()
result = deque()
while len(stack) != 0:
  item = stack.pop()
  if isinstance(item, list):
    for e in item:
      stack.append(e)
  else:
    result.appendleft(item)
result = list(result)
result

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

小結(jié)

想不到小小的列表拉平還有這么多學(xué)問,希望今天的分享能夠?qū)ψ屇銓W(xué)有所獲。

到此這篇關(guān)于將不規(guī)則的Python多維數(shù)組拉平到一維的方法實現(xiàn)的文章就介紹到這了,更多相關(guān)Python多維數(shù)組拉平到一維內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Matplotlib中%matplotlib inline如何使用

    Matplotlib中%matplotlib inline如何使用

    這篇文章主要介紹了Matplotlib中%matplotlib inline如何使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 利用PyQt5+Matplotlib 繪制靜態(tài)/動態(tài)圖的實現(xiàn)代碼

    利用PyQt5+Matplotlib 繪制靜態(tài)/動態(tài)圖的實現(xiàn)代碼

    這篇文章主要介紹了利用PyQt5+Matplotlib 繪制靜態(tài)/動態(tài)圖的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python中的[1:]、[::-1]、X[:,m:n]和X[1,:]的使用

    python中的[1:]、[::-1]、X[:,m:n]和X[1,:]的使用

    本文主要介紹了python中的[1:]、[::-1]、X[:,m:n]和X[1,:]的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 探究Python的Tornado框架對子域名和泛域名的支持

    探究Python的Tornado框架對子域名和泛域名的支持

    這篇文章主要介紹了探究Python的Tornado框架對子域名和泛域名的支持,Tornado作為一個典型的異步框架、在Python開發(fā)者中的人氣相當(dāng)高,需要的朋友可以參考下
    2015-05-05
  • django mysql數(shù)據(jù)庫及圖片上傳接口詳解

    django mysql數(shù)據(jù)庫及圖片上傳接口詳解

    這篇文章主要介紹了django mysql數(shù)據(jù)庫及圖片上傳接口詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 一文學(xué)會如何將Python打包后的exe還原成.py

    一文學(xué)會如何將Python打包后的exe還原成.py

    反編譯的第一步就是要將exe文件轉(zhuǎn)換成py文件,下面這篇文章主要給大家介紹了如何通過一文學(xué)會將Python打包后的exe還原成.py的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 分布式爬蟲scrapy-redis的實戰(zhàn)踩坑記錄

    分布式爬蟲scrapy-redis的實戰(zhàn)踩坑記錄

    最近用scrapy-redis嘗試了分布式爬蟲,使用過程中也遇到了不少問題,下面這篇文章主要給大家介紹了關(guān)于分布式爬蟲scrapy-redis的實戰(zhàn)踩坑記錄,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • python畫環(huán)形圖的方法

    python畫環(huán)形圖的方法

    這篇文章主要為大家詳細(xì)介紹了python畫環(huán)形圖的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 深入理解Python中字典的鍵的使用

    深入理解Python中字典的鍵的使用

    這篇文章主要介紹了深入理解Python中字典的鍵的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • 利用python進行接口測試及類型介紹

    利用python進行接口測試及類型介紹

    這篇文章主要介紹了利用python進行接口測試詳情,文章基于python展開對接口測試的詳細(xì)介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05

最新評論