我有一個這樣的清單:
list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
我想變平(預期結果):
list1=[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]
我正在使用此代碼:
flat_list = []
for sublist in list1:
for item in sublist:
flat_list.append(item)
但我回來了:
list1=['milk', 'bread', 'eggs', 'eggs', ['milk'], 'bread']
有任何想法嗎?
uj5u.com熱心網友回復:
您可以檢查您是否正在點擊串列,如果它是一個串列,則擴展它,如果不是附加它。
flat_list = []
for sublist in list1:
flat_list.append([])
for x in sublist:
if isinstance(x, list):
flat_list[-1].extend(x)
else:
flat_list[-1].append(x)
輸出:
[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]
但是,如果您有以下內容,這將不起作用:
[['milk', ['bread', ['eggs']]]]
或者您可以使用以下函式(不使用遞回,因此速度會更快):
def flatten_list(list1):
out = []
inside = list1
while inside:
x = inside.pop(0)
if isinstance(x, list):
inside = x inside
else:
out.append(x)
return out
out = [flatten_list(sublist) for sublist in list1]
flatten_list([['milk', ['bread', ['eggs']]]]) #['milk', 'bread', 'eggs']
uj5u.com熱心網友回復:
這是可以解決您的問題的代碼
list1 = [['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
flat_list = []
for i in list1:
temp_list =[]
for j in i:
if type(j) is list:
temp_list.append(j[0])
else:
temp_list.append(j)
flat_list.append(temp_list)
現在flat_list輸出是
[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]
uj5u.com熱心網友回復:
您可以使用遞回生成器以任意嵌套級別(僅受遞回深度限制)來展平串列:
list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
def flatten(iterable):
from collections.abc import Iterable
for item in iterable:
if isinstance(item, Iterable) and not isinstance(item, str):
yield from flatten(item)
else:
yield item
list(flatten(list1))
輸出: ['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']
僅在第一級之后展平:
out = [list(flatten(l)) for l in list1]
輸出: [['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread']]
uj5u.com熱心網友回復:
另一個(這次使用遞回生成器函式):
list1 = [
['milk', 'bread', 'eggs'],
['eggs', ['milk'], 'bread'],
[[['eggs']], 'milk', [['bread']]]
]
def flatten(lst):
for item in lst:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
list2 = [list(flatten(sublist)) for sublist in list1]
print(list2)
這將產生
[['milk', 'bread', 'eggs'], ['eggs', 'milk', 'bread'], ['eggs', 'milk', 'bread']]
uj5u.com熱心網友回復:
遞回函式可能是處理此問題的最簡單方法:
def flatten(L):
return [f for v in L for f in flatten(v)] if isinstance(L,list) else [L]
list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
print(flatten(list1))
['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']
您還可以使用迭代方法(在本示例中就地執行):
def flatten(L):
for i,_ in enumerate(L):
while isinstance(L[i],list):
L[i:i 1] = L[i]
list1=[['milk', 'bread', 'eggs'], ['eggs', ['milk'], 'bread']]
flatten(list1)
print(list1)
['milk', 'bread', 'eggs', 'eggs', 'milk', 'bread']
在 for 回圈中使用 enumerate() 是隨著串列的增長不斷獲取額外的索引
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377048.html
