【问题标题】:Selecting the maximum value for each key in a dictionary python为字典python中的每个键选择最大值
【发布时间】:2020-03-16 08:33:57
【问题描述】:

对于我的代码,我需要对包含键和值的大量数据行(来自 .csv 文件)进行排序。但是,对于每个键,都有许多值。我需要形成可以循环的代码并形成一个字典,在其中打印每个特定键的最高值的键。

dict = {}

for i in dict:
    dict.update({i: 0})

for line in data:
    dict = line.split(",")
    value = int(data[14]) 
    key = int(data[3])
    dict.update({key: value})

print(maximum_population)

上面的代码打印了所有数据,我需要添加代码,这意味着它只打印每个键的最大值

{键:最高值}

【问题讨论】:

  • 您的数据是什么样的?你能从你的数据文件中显示一条小线吗
  • 有大量数据,但是这部分代码集中在 2 列 - 关键示例 = 5 6 6 3 3 6 6 4 2 2 5 7 7 8 8 6 3 6 4 3 9 15 13 。值示例= 232315 23 231723 25 232389 19 231819 232368 30 232370 231864 16 230150 14 230191 230688 228461 227789 226375 226928 222235730即 {5: 232315}

标签: python python-3.x csv dictionary


【解决方案1】:

正如其他人所提到的,您应该发布数据样本。您现在循环它的方式没有多大意义 - 您正在使用 dict = line.split(",") 创建一个列表,然后您没有使用它。

要改进另一个答案,无需对任何值进行排序。使用 max() 来保持这个操作的线性时间。

data_dict = {"k1": [1,2,3,4], "k2": [101, 2, 43], ...}
result = {key: max(values) for key, values in data_dict.items()}

如果要打印结果:

for k, v in result.items():
    print(k, v)

【讨论】:

    【解决方案2】:

    如果您读取一行上的键和同一行上的多个值,您的问题不清楚。或者,如果您的意思是您从每一行中仅读取一个键和单个值,并且该键可能会再次出现在其他行上,并且您只想将键映射到该键出现的多行中的任何一行上看到的最高值开。

    根据您的评论,我假设每一行都有一个键和值,但该键可能出现在另一行中。 IE 每行没有唯一的键,您希望该键的值最高。

    为此,我刚刚将数据压缩成对,就像它们在同一行一样。原理是一样的,如果我们没见过这个key就和value一起存储,否则如果我们见过这个key并且这个value比我们之前看到的值高,就更新这个key的value

    keys = "5 6 6 3 3 6 6 4 2 2 5 7 7 8 8 6 3 6 4 3 9 15 13"
    values = "232315 23 231723 25 232389 19 231819 232368 30 232370 231864 16 230150 14 230191 230688 228461 227789 226375 226928 225213 225174 223570"
    data = zip((int(key) for key in keys.split()), (int(value) for value in values.split()))
    my_highest_values = {}
    
    for key, value in data:
        print("#", key, value)
        if key in my_highest_values:
            if value > my_highest_values[key]:
                my_highest_values[key] = value
        else:
            my_highest_values[key] = value
    
    print(my_highest_values)
    

    输出

    {5: 232315, 6: 231819, 3: 232389, 4: 232368, 2: 232370, 7: 230150, 8: 230191, 9: 225213, 15: 225174, 13: 223570}
    

    【讨论】:

    • 对不起,这是将值作为 str 而不是 int 进行比较。更新了答案以将数据加载为整数列表并将它们压缩在一起
    【解决方案3】:

    试试下面的代码 data 是一个带有键和值列表的字典

    e.g :: data = {1:[1,2,3,4],2:[8,7,6]}
    
    def maximum_population(data):
        result={}
        for k,v in data.items():
            v.sort(reverse=True)
            result[k] = v[0]
        return result 
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多