Skip to main content
 首页 » 编程设计

python之用规则统一字典列表的最快方法

2025年05月04日9Terrylee

我有一个字典列表:

list1 = [ 
  { 'T': 1234, 'V': 10, 'O': 1 }, 
  { 'T': 2345, 'V': 50, 'O': 5 }, 
  { 'T': 2345, 'V': 30, 'O': 3 }, 
  { 'T': 3456, 'V': 40, 'O': 91 }, 
] 

我需要对这些进行唯一排序:

  • T 应该是唯一的
  • 字典的 V 较大的优先

应该产生:

[ 
  {'T': 1234, 'V': 10, 'O': 1},  
  {'T': 2345, 'V': 50, 'O': 5},  
  {'T': 3456, 'V': 40, 'O': 91} 
] 

我想到了这个:

interm = {o['T']: o for o in list1} 
for o in list1: 
  if o['V'] > interm[o['T']]['V']: 
    interm[o['T']] = o 

然而,我有效地迭代了列表两次,并多次设置了字典值。感觉它可以改进,但我不知道我该怎么做。

在给定的约束条件下,是否有更快的方法来完成此任务?

请您参考如下方法:

假设 list1 已经按 T 排序,您可以使用 itertools.groupby。

from itertools import groupby 
 
li = [ 
  { 'T': 1234, 'V': 10, 'O': 1 }, 
  { 'T': 2345, 'V': 50, 'O': 5 }, 
  { 'T': 2345, 'V': 30, 'O': 3 }, 
  { 'T': 3456, 'V': 40, 'O': 91 }, 
] 
 
output = [max(group, key=lambda d: d['V']) 
          for _, group in groupby(li, key=lambda d: d['T'])] 
 
print(output) 
# [{'T': 1234, 'V': 10, 'O': 1}, {'T': 2345, 'V': 50, 'O': 5}, {'T': 3456, 'V': 40, 'O': 91}] 

如果不是,groupby 仍然可以与 sort 一起使用以实现 O(nlogn) 解决方案

order_by_t = lambda d: d['T'] 
 
li.sort(key=order_by_t) 
 
output = [max(group, key=lambda d: d['V']) 
          for _, group in groupby(li, key=order_by_t)]