我有一個看起來像這樣的字典:
OrderedDict([('arguments', {'index': 1, 'parent': None}), ('controls', {'index': 2, 'parent': None}), ('examples', {'index': 3, 'parent': None}), ('journal', {'index': 4, 'parent': None}), ('journal/config', {'index': 5, 'parent': 'journal'}), ('journal/journaltest', {'index': 6, 'parent': 'journal'}), ('procs', {'index': 7, 'parent': None}), ('processor', {'index': 8, 'parent': None}), ('prediction', {'index': 9, 'parent': None}), ('reports', {'index': 10, 'parent': None}), ('tooki', {'index': 11, 'parent': None}), ('tooki/help', {'index': 12, 'parent': 'tooki'}), ('tooki/lime', {'index': 13, 'parent': 'tooki'}), ('tooki/medium', {'index': 14, 'parent': 'tooki'}), ('tooki/share', {'index': 15, 'parent': 'tooki'}), ('tooki/trigger', {'index': 16, 'parent': 'tooki'})])
我如何迭代這個字典的元素,并排除任何具有“'父':無”且沒有子元素的元素(意思是,這個字典中沒有其他元素有這個作為父元素)。
預期輸出:
OrderedDict([('journal', {'index': 4, 'parent': None}), ('journal/config', {'index': 5, 'parent': 'journal'}), ('journal/journaltest', {'index': 6, 'parent': 'journal'}), ('tooki', {'index': 11, 'parent': None}), ('tooki/help', {'index': 12, 'parent': 'tooki'}), ('tooki/lime', {'index': 13, 'parent': 'tooki'}), ('tooki/medium', {'index': 14, 'parent': 'tooki'}), ('tooki/share', {'index': 15, 'parent': 'tooki'}), ('tooki/trigger', {'index': 16, 'parent': 'tooki'})])
uj5u.com熱心網友回復:
ins = OrderedDict(...)
parents = set(elem['parent'] for elem in ins.values() if elem['parent'] is not None)
d = OrderedDict()
for key, value in ins.items():
if value['parent'] is not None:
d[key] = value
elif any(ins.get(k) is not None for k in parents):
d[key] = value
使用一組父鍵可以消除很多復雜性。在您的情況下,有很多元素,但只會檢查兩個鍵。
uj5u.com熱心網友回復:
我認為這個功能可以幫助你
def orderedDict(data_list: list):
result: list = []
for data in data_list:
is_ok = True
if data[1]["parent"] is None:
is_ok = False
for item in [x[0] for x in [y for y in data_list if y[0] != data[0]]]:
if data[0] "/" in item:
is_ok = True
break
if is_ok:
result.append(data)
return result
要使用它:
if __name__ == '__main__':
data = ([('arguments', {'index': 1, 'parent': None}), ('controls', {'index': 2, 'parent': None}),
('examples', {'index': 3, 'parent': None}), ('journal', {'index': 4, 'parent': None}),
('journal/config', {'index': 5, 'parent': 'journal'}),
('journal/journaltest', {'index': 6, 'parent': 'journal'}), ('procs', {'index': 7, 'parent': None}),
('processor', {'index': 8, 'parent': None}), ('prediction', {'index': 9, 'parent': None}),
('reports', {'index': 10, 'parent': None}), ('tooki', {'index': 11, 'parent': None}),
('tooki/help', {'index': 12, 'parent': 'tooki'}), ('tooki/lime', {'index': 13, 'parent': 'tooki'}),
('tooki/medium', {'index': 14, 'parent': 'tooki'}),
('tooki/share', {'index': 15, 'parent': 'tooki'}),
('tooki/trigger', {'index': 16, 'parent': 'tooki'})])
result = orderedDict(data_list=data)
print(result)
uj5u.com熱心網友回復:
這樣做的一種非常愚蠢的方式:
x = OrderedDict(blah blah blah)
keys_to_exclude = []
for key1, val1 in x.items():
if val1['parent'] is None:
remove = True
for key2, val2 in x.items():
if val2['parent'] == key1:
remove = False
if remove:
keys_to_exclude.append(key1)
for key in keys_to_exclude:
x.pop(key, None)
這段代碼顯然具有 O(n^2) 復雜度。一個更聰明的方法是預先為每個元素添加一個“子”鍵,復雜度為 O(n)。
uj5u.com熱心網友回復:
這是對我有用的東西。最終輸出的順序不一樣,但是按照你說的條件,我能滿足排除key valuepairs的要求。
a = OrderedDict([('arguments', {'index': 1, 'parent': None}),
('controls', {'index': 2, 'parent': None}),
('examples', {'index': 3, 'parent': None}),
('journal', {'index': 4, 'parent': None}),
('journal/config', {'index': 5, 'parent': 'journal'}),
('journal/journaltest', {'index': 6, 'parent': 'journal'}),
('procs', {'index': 7, 'parent': None}),
('processor', {'index': 8, 'parent': None}),
('prediction', {'index': 9, 'parent': None}),
('reports', {'index': 10, 'parent': None}),
('tooki', {'index': 11, 'parent': None}),
('tooki/help', {'index': 12, 'parent': 'tooki'}),
('tooki/lime', {'index': 13, 'parent': 'tooki'}),
('tooki/medium', {'index': 14, 'parent': 'tooki'}),
('tooki/share', {'index': 15, 'parent': 'tooki'}),
('tooki/trigger', {'index': 16, 'parent': 'tooki'})])
od = OrderedDict()
for each in a:
if (parent := a[each].get('parent', None)):
od[parent] = a[parent]
for each in a:
if (element := a[each].get('parent', None)):
od[each] = a[each]
print(od)
我不理解理解代碼的簡單性。第一個回圈將父母保存到一個新的OrdereDict. 第二個救孩子。如果您的要求沒有得到滿足,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/465141.html
上一篇:Python隨機重命名嵌套在Dict[Array]中的dicts中的值
下一篇:如何將物件串列轉換為地圖?
