簡體   English   中英

比較和刪除 python 列表字典中的鍵值數據

[英]comparing and removal of key value data inside python list dict

我有下面的列表字典數據,我試圖迭代並比較nrsd的值,如果這三個都相同,則刪除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)重新排列基於nrsd和(負) v的字典,然后(ii)取每個組中具有相同nrsd的第一個字典:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM