比较循环次数较少的词典

2024-03-28 10:41:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本以词典为价值观的词典。下面是我词典的结构

myD = {'key1': {'x' : 123, 'y' : 432},
       'key2': {'x' : 456, 'y' : 565},
       'key3': {'x' : 789, 'y' : 420},
       ...}

我需要比较这个字典的值(你可以看到我在每个值中都有相似的字典结构)并生成以下输出。策略是在值字段中遍历每个字典,为给定的键选择最小值并将其插入到新字典中。例如,如果我们考虑值字典中的x键,它的最小值是123。所以我的新字典应该有x:123。你知道吗

my_newD =  {'x' : 123, 'y' : 420, ...}

我可以使用3个for循环来实现这一点,但是有没有什么优雅的方法可以用更少的for循环来实现这一点?你知道吗


Tags: 方法for字典my结构策略词典key2
3条回答

另一种可能性是pandas(在优雅方面更好):

import pandas as pd
my_newD = pd.DataFrame(myD).min(axis=1).to_dict()

我想出了两个循环:

my_newD = {key: min(item[key] for item in myD.values()) 
           for key in  next(iter(myD.values()))}

EDIT:按照@Andriy Makukha的建议,删除了对外循环中'key1'的显式依赖

编辑2:用next(iter(myD.values()))替换myD[list(myD.keys())[0]]
不确定哪一个不那么神秘,但是使用nextiter看起来更有效。
感谢Leo K指出这一点!你知道吗

下面是一个使用collections.defaultdict的O(n)解:

from collections import defaultdict

myD = {'key1': {'x' : 123, 'y' : 432},
       'key2': {'x' : 456, 'y' : 565},
       'key3': {'x' : 789, 'y' : 420}}

# initialise defaultdict of lists
d = defaultdict(list)

# iterate input dictionary and add values to lists
for v1 in myD.values():
    for k2, v2 in v1.items():
        d[k2].append(v2)

# calculate minimum
res = {k: min(v) for k, v in d.items()}

print(res)

{'x': 123, 'y': 420}

相关问题 更多 >