這個問題在這里已經有了答案: 如何在python中將異類串列扁平化為單個串列? (11 個回答) 6 小時前關閉。
我想將包含在一些不可迭代物件中的串列中的串列擴展為平面。
我嘗試使用串列理解來執行此操作,但是在不可迭代物件中出現錯誤。
如何將此串列擴展到平面?
# [[1, 2], 3] -> [1, 2, 3]
list = [[1, 2], 3]
flat = [item for sublist in list for item in sublist] # TypeError: 'int' object is not iterable
print(flat)
在我的環境中,除了標準功能之外,還安裝了 numpy。
我試過了numpy.concatenate(list).flat,但出現錯誤。
# [[1, 2], 3] -> [1, 2, 3]
list = [[1, 2], 3]
flat = numpy.concatenate(list).flat # ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 0 dimension(s)
print(flat)
uj5u.com熱心網友回復:
如果可迭代物件只是串列并且只有一層深,則可以在串列理解中進行。
L = [[1, 2], 3]
flat = [v for item in L for v in (item if isinstance(item,list) else [item])]
如果有多個級別和各種可迭代型別,您可能需要一個遞回函式:
def flatten(L):
if not isinstance(L,(list,tuple,set)): # you probably don't want str here
yield L
return
for F in L:
yield from flatten(F)
L = [[1, 2], 3, ({5,6,7},[8,9],10)]
flat = list(flatten(L))
print(flat)
[1, 2, 3, 5, 6, 7, 8, 9, 10]
uj5u.com熱心網友回復:
你可以試試這個,看看你在找什么:
它可以flatten通過遞回呼叫自己的任何級別(深度嵌套)。請注意,這還沒有進行性能測驗,因此可能還有改進的空間。
import collections
def flatten(L):
if isinstance(L, collections.Iterable):
return [a for i in L for a in flatten(i)] # recursively calling
else:
return [L]
運行它:
lst = [[1, 2], 3, [[4, 5], 6] ]
print(flatten(lst)) # [1, 2, 3, 4, 5, 6]
lst2 = [[1, 2], 3, [[4, 5, [6]]], 7, 8]
print(flatten(lst2)) # [1, 2, 3, 4, 5, 6, 7, 8] # deeply nested
uj5u.com熱心網友回復:
可能有更優雅的解決方案,但最簡單的方法是只迭代幾個for回圈,檢查值型別:
flat = []
for item in list:
try:
for subitem in item:
flat.append(subitem)
except TypeError: # Not iterable, append as is
flat.append(item)
請注意,這假設嵌套只有一層深。
uj5u.com熱心網友回復:
首先,我強烈建議避免使用諸如list、dict、set等識別符號,因為這些是來自 Python 的資料型別,即使允許使用該語法,您也會將它們“隱藏”在您的應用程式中不使用。
此外,作為建議,避免將串列理解用于更復雜的操作,因為它們可能變得難以閱讀。
我推薦以下方法:
my_list = [[1, 2], 3]
flat = []
for item in my_list:
if isinstance(item, list):
for val in item:
flat.append(val)
else: flat.append(item)
print(flat)
使用串列理解,解決方案如下所示:
my_list = [[1, 2], 3]
flat = [v for item in my_list for v in (item if isinstance(item,list) else [item])]
print(flat)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/334176.html
上一篇:根據行索引0洗掉列
