3 回答

TA貢獻2016條經驗 獲得超9個贊
我認為你讓這變得比它需要的更難。
無論您有多少維度,將其展平為 2D;你沒有使用比三元素列表更深的東西。
現在簡單地制作一個集合列表,每個維度中的元素
e = [set(row[col] for row in 2d_list) for col in range(len(2d_list[0]))]
現在,從這些集合中的每一個中減去(集合差異)之前的每個集合。
e[1] -= e[0]
e[2] -= e[0] + e[1]
...您也可以在循環中對其進行參數化。

TA貢獻1872條經驗 獲得超4個贊
您可以維護 2 個字典:
一個用于跟蹤每個值的最小索引
一種用于跟蹤索引 -> 值集映射
然后,對于ll您檢索的每一個,您都可以按與(展平)長度成比例的時間進行更新,ll而無需重建整個traversal_dict字典:
from collections import defaultdict
min_pos = defaultdict(int)
traversal_dict = defaultdict(set)
for ll in lll: # assume this is streamed / iterated
for l in ll:
for (i, val) in enumerate(l):
if val not in min_pos: # O(1) to update both dictionaries
min_pos[val] = i
traversal_dict[i].add(val)
elif i < min_pos[val]:
traversal_dict[min_pos[val]].remove(val)
min_pos[val] = i
traversal_dict[i].add(val)
print traversal_dict # retrieve answer after each iteration
輸出(對于lll每次迭代后您的問題中給出的):
defaultdict(<class 'set'>, {0: {8, 1}, 1: {9, 5, 15}, 2: {12, 13}})
defaultdict(<class 'set'>, {0: {8, 1, 11, 4}, 1: {5, 9, 14, 15, 18}, 2: {3, 6, 12, 13, 19}})
defaultdict(<class 'set'>, {0: {1, 4, 8, 11, 17, 19}, 1: {5, 9, 13, 14, 15, 16, 18}, 2: {3, 6, 12}})

TA貢獻2051條經驗 獲得超10個贊
IIUC,您可以執行以下操作:
lll = [[[1, 15, 12], [8, 5, 13], [1, 9, 12]],
[[4, 1, 19], [11, 18, 3], [8, 14, 6]],
[[17, 8, 4], [1, 16, 3], [19, 13, 11]]]
def flatten(lst):
"""Flatten an arbitrary nested list, if the element is not a list return its position"""
for i, e in enumerate(lst):
if isinstance(e, list):
yield from flatten(e)
else:
yield (i, e)
# create a dictionary of value -> min-pos
d = {}
for i, e in flatten(lll):
d[e] = i if e not in d else min(d[e], i)
# reverse the dictionary
reverse = {}
for key, value in d.items():
reverse.setdefault(value, []).append(key)
print(reverse)
輸出
{0: [1, 8, 4, 19, 11, 17], 1: [15, 5, 13, 9, 18, 14, 16], 2: [12, 3, 6]}
如果要將列表轉換為集合:
result = {key : set(value) for key, value in reverse.items()}
print(result)
輸出
{0: {1, 4, 8, 11, 17, 19}, 1: {5, 9, 13, 14, 15, 16, 18}, 2: {3, 12, 6}}
添加回答
舉報