[英]Pythonic way to create a dictionary from a list where the keys are the elements that are found in another list and values are elements between keys
[英]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' 具有該索引的最高值並在計數中加一。
我試過Counter
和max(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(*([(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.