【问题标题】:comparing and removal of key value data inside python list dictpython list dict中键值数据的比较和删除
【发布时间】:2021-11-25 14:26:14
【问题描述】:

我有以下列表字典数据,我正在尝试迭代和比较 n, r, sd 如果这三个都相同,则删除整个 dict 块,其中v 的值较低。

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'
  }  
]

【问题讨论】:

  • 能否请您提供您的尝试。
  • 给定输入的预期输出是什么?
  • @Inogueir 我已经提供了有问题的所需 O/p
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python json python-3.x dictionary


【解决方案1】:

您可以使用itertools.groupby;这 (i) 基于nrsd 和(负)v 重新排列字典,然后 (ii) 获取每个组中具有相同 n、@987654327 的第一个字典@,和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)

输出:

[
  {'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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2023-03-09
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多