PYTHON壓平嵌套列表

来源:http://www.cnblogs.com/shouce/archive/2016/06/08/5569167.html
-Advertisement-
Play Games

list 是 Python 中使用最頻繁的數據類型, 標準庫裡面有豐富的函數可以使用。不過,如果把多維列表轉換成一維列表(不知道這種需求多不多),還真不容易找到好用的函數,要知道Ruby、Mathematica、Groovy中可是有flatten的啊。如果列表是維度少的、規則的,還算好辦例如: li ...


list 是 Python 中使用最頻繁的數據類型, 標準庫裡面有豐富的函數可以使用。
不過,如果把多維列表轉換成一維列表(不知道這種需求多不多),還真不容易找到好用的函數,
要知道Ruby、Mathematica、Groovy中可是有flatten的啊。
如果列表是維度少的、規則的,還算好辦
例如:

複製代碼
li=[[1,2],[3,4],[5,6]]
print [j for i in li for j in i]
#or
from itertools import chain
print list(chain(*li))
#or
a=[[1,2],[3,4],[5,6]]
t=[]
[t.extend(i) for i in a]
print t
#or
print sum(li,[])
複製代碼

對於複雜一些的,如:li=[1,[2],[[3]],[[4,[5],6]]],上面的方法就不好使了,得換個方法了,
從結構上看像是樹狀的,很容易聯想到了目錄的遍歷,於是就有了下麵的做法:

複製代碼
def flat(tree):
    res = []
    for i in tree:
        if isinstance(i, list):
            res.extend(flat(i))
        else:
            res.append(i)
    return res
複製代碼

另一種思路,嵌套列表無非就是有很多成對的方括弧,一維的列表只有一對,把中間的去掉就行了,轉換為字元串就好辦了

def flatten(seq):
    s=str(seq).replace('[', '').replace(']', '') #當然也可以用正則
    return [eval(x) for x in s.split(',') if x.strip()]

不過,這種做法對於列表中出現包含"["或"]"的字元串時就無能為力了,需要改進.


其他方法:

國外某論壇上見到的,同樣是遞歸,一行搞定

flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L]

下麵這個方法用到Tkinter模塊,在郵件列表看到的方法。估計很多同學還不知道它能辦到吧,也算是python自帶。註意,windows版的python都自帶Tkinter模塊的,linux預設則沒有

複製代碼
from Tkinter import _flatten

li=reduce(lambda *x:list(x),range(2,6),[1])
print li
print _flatten(li)
#Out:
#[[[[[1], 2], 3], 4], 5]
#(1, 2, 3, 4, 5)
#對元組同樣適用
複製代碼

 

還有一些第三方模塊提供這樣的功能,如sympy、numpy、pipe等

對於嵌套的元組,無需多說了吧,只需稍加改動就可以了

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JSON的用途 使用基於JavaScript的應用程式,其中包括瀏覽器擴展和網站 使用JSON格式序列化和結構化的數據傳輸網路連接 這主要用於伺服器和Web應用程式之間的數據傳輸 Web服務和API採用JSON格式提供公共數據 它可以用來與現代編程語言 JSON的特點 易於讀寫JSON 輕量級的基於 ...
  • 概述 OTP 平臺的容錯性高,是因為它提供了機制來監控所有 processes 的狀態,如果有進程出現異常, 不僅可以及時檢測到錯誤,還可以對 processes 進行重啟等操作。 有了 supervisor,可以有效的提高系統的可用性,一個 supervior 監督一個或多個應用, 同時, sup ...
  • 十進位轉二進位,除2運算 十進位6轉二進位是 110 (註意從右往左寫,使用算式從下往上寫) 二進位轉十進位,乘2過程 二進位110轉十進位 0*2的0次方+1*2的1次方+1*2的2次方=6 對應關係 0 1 0 1 0 1 32 16 8 4 2 1 把1對應的位置的數加起來就可以了,所以是21 ...
  • 一、CAS和synchronized適用場景 1、對於資源競爭較少的情況,使用synchronized同步鎖進行線程阻塞和喚醒切換以及用戶態內核態間的切換操作額外浪費消耗cpu資源;而CAS基於硬體實現,不需要進入內核,不需要切換線程,操作自旋幾率較少,因此可以獲得更高的性能。 2、對於資源競爭嚴重 ...
  • Python支持四種不同的數值類型,包括int(整數)long(長整數)float(浮點實際值)complex (複數),本文章向碼農介紹python 四種數值類型,需要的朋友可以參考一下。 數字數據類型存儲數值。他們是不可改變的數據類型,這意味著改變數字數據類型的結果,在一個新分配的對象的值。Nu ...
  • 我們可以用groovy編寫日常的批處理腳本,類似windows下的bat或者unix下的shell。其具體的編寫方式非常簡單,比如我們想要執行一個dir的命令,只要編寫一個test.groovy,其中內容為: println 'cmd /c dir'.execute().text 因為dir這個命令 ...
  • //資源和認證伺服器不相同http://xxxx:8080/flowAuth/oauth/authorize?client_id=jerry&redirect_uri=http%3a%2f%2fxxxx%3a8080%2fAuthProvider%2ftest%2findex.do&response ...
  • python3+任務計劃實現的人人影視網站自動簽到 這是一個自動化程度較高的程式,運行本程式後會從chrome中讀取cookies用於登錄人人影視簽到, 並且會自動添加一個windows 任務計劃,這個任務計劃每天下午兩點會執行本程式進行簽到。 sys.executable == 'C:\\Pyth ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...