簡體   English   中英

在具有列表值的字典中按索引計算最大元素的 Pythonic 方法

[英]Pythonic way of counting max elements by index in a dictionary with list values

我想按每個索引比較字典中的列表(作為值),並在另一個字典中保存每個“鍵”具有最高值的次數。

舉個例子,我有這本字典:

my_dict = {'a': [1, 2, 5], 'b': [2, 1, 4], 'c': [1, 0, 3]}

我想以這樣的字典結尾:

count_dict = {'a': 2, 'b': 1, 'c': 0}

因為:

  • 在列表的索引 0 處,我們有: 1來自 'a'; 2來自“b”; 1來自“c”。

    因此,'b' 具有該索引的最高值並在計數中加一。

  • 在列表的索引 1 處,我們有: 2來自 'a'; 1來自“b”; 0來自 'c'。

    因此,'a' 具有該索引的最高值並在計數中加一。

  • 在列表的索引 2 處,我們有: 5來自 'a'; 4來自“b”; 3來自“c”。

    因此,'a' 具有該索引的最高值並在計數中加一。


我試過Countermax(my_dict, key=my_dict.get) 但是什么是最 pythonic 的方式而不是這樣做:

for i in range(len(my_dict['a'])):
    max_value = max(my_dict[key][i] for key in my_dict)
    for key in my_dict:
        if my_dict[key][i] == max_value:
            max_count[key] += 1

print(max_count)

你可以 zip 他們:

res = {k:0 for k in my_dict}
keys = [*my_dict] # note that order in dictionaries is only guaranteed in python 3.7+
for l in zip(*my_dict.values()):
   res[keys[l.index(max(l))]] += 1

你可以zip操縱它們以包含它們各自的鍵后的values

zip(*([(k, v) for v in l] for k, l in my_dict.items()))
# gives: [(('a', 1), ('b', 2), ('c', 1)), (('a', 2), ('b', 1), ('c', 0)), (('a', 5), ('b', 4), ('c', 3))]

現在對於每個項目,根據value找到max ,並增加匹配的計數:

from collections import Counter

my_dict = {'a': [1, 2, 5], 'b': [2, 1, 4], 'c': [1, 0, 3]}

c = Counter()
for item in zip(*([(k, v) for v in l] for k, l in my_dict.items())):
    c[max(item, key=lambda x: x[1])[0]] += 1

print(c)

將打印{'a': 2, 'b': 1}因為從未添加c 但是Counter s 的美妙之處在於,即使你執行c['c']你仍然會得到0


這不依賴於鍵的順序或索引,因此適用於任何 Python 版本。

zip()與枚舉和 lambda 一起使用的替代方法。

dict_result = {key: 0 for key in my_dict}

for idx, values in enumerate(zip(*my_dict.values())):
    max_key = max(my_dict, key=lambda k: my_dict[k][idx])
    dict_result[max_key] += 1
    
print(dict_result)

{'a': 2, 'b': 1, 'c': 0}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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