[英]comparing and removal of key value data inside python list dict
我有下面的列表字典數據,我試圖迭代並比較n
、 r
、 sd
的值,如果這三個都相同,則刪除v
值較低的整個 dict 塊。
ab = [
{
'n': 'abc',
'r': 'PHX',
'sd': 'cert',
'dd': null,
'TimeCreated': 1627298805136,
'v': 2,
'o': 'symrxt7mhzuu3o5kq'
},
{
'n': 'abc',
'r': 'PHX',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631868530689,
'v': 3,
'o': '52cf7qrfdalpa'
},
{
'n': 'def',
'r': 'ASHBURN',
'sd': 'cert',
'dd': null,
'TimeCreated': 1628827511212,
'v': 2,
'o': 'mjmbw2oabhxiq'
},
{
'n': 'def-kup',
'r': 'ASHBURN',
'sd': 'cert',
'dd': null,
'TimeCreated': 1598527021488,
'v': 1,
'o': '5a'
},
{
'n': 'ghi',
'r': 'AP_SYDNEY_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1610377812778,
'v': 1,
'o': '2zy'
},
{
'n': 'ghi',
'r': 'AP_SYDNEY_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631877819065,
'v': 2,
'o': 'ongu7be56y7cc'
},
{
'n': 'jkl',
'r': 'EU_FRANKFURT_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1611334435645,
'v': 1,
'o': 'xpa'
},
{
'n': 'jkl',
'r': 'EU_FRANKFURT_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631879049498,
'v': 2,
'o': '57nrzqhrmwa'
}
]
我知道我們可以比較兩個字典,但是在字典列表中比較鍵值並刪除它們我不確定如何獲得任何幫助將是非常需要的 O/p:
[
{
'n': 'abc',
'r': 'PHX',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631868530689,
'v': 3,
'o': '52cf7qrfdalpa'
},
{
'n': 'def',
'r': 'ASHBURN',
'sd': 'cert',
'dd': null,
'TimeCreated': 1628827511212,
'v': 2,
'o': 'mjmbw2oabhxiq'
},
{
'n': 'def-kup',
'r': 'ASHBURN',
'sd': 'cert',
'dd': null,
'TimeCreated': 1598527021488,
'v': 1,
'o': '5a'
},
{
'n': 'ghi',
'r': 'AP_SYDNEY_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631877819065,
'v': 2,
'o': 'ongu7be56y7cc'
},
{
'n': 'jkl',
'r': 'EU_FRANKFURT_1',
'sd': 'cert',
'dd': null,
'TimeCreated': 1631879049498,
'v': 2,
'o': '57nrzqhrmwa'
}
]
您可以使用itertools.groupby
; 這(i)重新排列基於n
、 r
、 sd
和(負) v
的字典,然后(ii)取每個組中具有相同n
、 r
和sd
的第一個字典:
from itertools import groupby
# ab = [ ... ]
ab_sorted = sorted(ab, key=lambda d: (d['n'], d['r'], d['sd'], -d['v']))
grouping_key = lambda d: (d['n'], d['r'], d['sd'])
groups = groupby(ab_sorted, key=grouping_key)
output = [next(g) for _, g in groups]
print(output)
Output:
[
{'n': 'abc', 'r': 'PHX', 'sd': 'cert', 'dd': 'null', 'TimeCreated': 1631868530689, 'v': 3, 'o': '52cf7qrfdalpa'},
{'n': 'def', 'r': 'ASHBURN', 'sd': 'cert', 'dd': 'null', 'TimeCreated': 1628827511212, 'v': 2, 'o': 'mjmbw2oabhxiq'},
{'n': 'def-kup', 'r': 'ASHBURN', 'sd': 'cert', 'dd': 'null', 'TimeCreated': 1598527021488, 'v': 1, 'o': '5a'},
{'n': 'ghi', 'r': 'AP_SYDNEY_1', 'sd': 'cert', 'dd': 'null', 'TimeCreated': 1631877819065, 'v': 2, 'o': 'ongu7be56y7cc'},
{'n': 'jkl', 'r': 'EU_FRANKFURT_1', 'sd': 'cert', 'dd': 'null', 'TimeCreated': 1631879049498, 'v': 2, 'o': '57nrzqhrmwa'}
]
或者使用具有相同邏輯的pandas
:
output = pd.DataFrame(ab).sort_values(by=['n', 'r', 'sd', 'v'], ascending=[True, True, True, False]).groupby(by=['n', 'r', 'sd'], as_index=False).first().to_dict(orient='records')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.