我在拆分嵌套串列時遇到問題。我的輸入有一個例子:
l = [[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'], [134, 158, 'A']], [[2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]]
我想通過第三個元素將它分成兩個單獨的嵌套串列:
l_b = [[[0,18], [76,101]], [[55, 115], [125,150]]]
l_a = [[[35,58], [103, 130], [134,158]], [[2,51]]]
我嘗試使用回圈搜索:
for i in l:
for ii in i:
if ii[2] == 'A':
l_a.append(ii)
但我只是得到一個平面串列,所以我丟失了索引。提前致謝 ;)
uj5u.com熱心網友回復:
取消嵌套串列,對其進行迭代并將每個元素的切片插入到鍵下的字典中。
l = [[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'],
[134, 158, 'A']], [[2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]]
flat = [k for x in l for k in x]
print(flat)
from collections import defaultdict
# this will automatically create the key with a list if needed
# no need to prepopulate it if you got "C"s and "D"s later on as well
grp = defaultdict(list)
for elem in flat:
# use 3rd element as key, use slice of first two as data
# will crash on less then 3 elements but your data is ok
grp[elem[2]].append(elem[:2])
print(*grp.items(), sep="\n")
輸出:
#flat
[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'],
[134, 158, 'A'], [2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]
# grouped
('A', [[35, 58], [103, 130], [134, 158], [2, 51]])
('B', [[0, 18], [76, 101], [55, 115], [125, 150]])
如果需要,您可以重新嵌套串列 - 只是看它沒有多大意義:
l_a = [grp["A"]]
您可以在代碼之后簡單地使用l_a = [l_a]它來重新嵌套它。
uj5u.com熱心網友回復:
如果出于某種原因需要保留嵌套結構:
l = [[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'], [134, 158, 'A']], [[2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]]
l_a = []
for i in l:
tmp_list = []
for ii in i:
if ii[2] == 'A':
tmp_list.append(ii[:2])
l_a.append(tmp_list)
uj5u.com熱心網友回復:
首先創建空串列 l_a 和 l_b,在 if 陳述句之后,您需要切片 ii[:2] 以僅包含數字。最后,包含 else 陳述句以附加 B 存在的值。
uj5u.com熱心網友回復:
l = [[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'], [134, 158, 'A']], [[2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]]
l_a_outer =[]
for i in l:
l_a = []
for ii in i:
if ii[2] == 'A':
l_a.append(ii)
l_a_outer.append(l_a)
print(l_a_outer)
樣本輸出
[[[35, 58, 'A'], [103, 130, 'A'], [134, 158, 'A']], [[2, 51, 'A']]
uj5u.com熱心網友回復:
當您專門針對“A”和“B”時,您可以為這兩個串列準備一個 dict,然后通過 dict 鍵填充這些串列:
l = [[[35, 58, 'A'], [0, 18, 'B'], [76, 101, 'B'], [103, 130, 'A'], [134, 158, 'A']], [[2, 51, 'A'], [55, 115, 'B'], [125, 150, 'B']]]
l_a = []
l_b = []
res = { "A": l_a, "B": l_b }
for chunk in l:
l_a.append([])
l_b.append([])
for *values, letter in chunk:
res[letter][-1].append(values)
print(l_a) # [[[35, 58], [103, 130], [134, 158]], [[2, 51]]]
print(l_b) # [[[0, 18], [76, 101]], [[55, 115], [125, 150]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425886.html
