python - 给定一个 [string, number] 元组列表,创建一个字典,其中键是字符串的第一个字符,值是数字的总和
问题描述
我有一个元组列表,其中第一个对象是字符串,第二个对象是数字。我需要创建一个字典,使用字符串的第一个字母作为键和数字(或者如果键相同,我需要添加一些数字)作为值。例如:
输入
lst = [('Alex', 5), ('Addy', 7), ('Abdul', 2), ('Bob', 6), ('Carl', 8), ('Cal', 4)]
输出
dct = {'A': 14, 'B': 6, 'C': 12}
解决方案
最简单、直接和幼稚的方法是:
dct = {}
for k, v lst:
if k in v:
dct[k] += v
else:
dct[k] = v
有一些方法可以逐渐变得更聪明,第一种可能是使用.get
默认值:
dct = {}
for k, v in lst:
dct[k] = dct.get(k, 0) + v
最后,您可以使用 a collections.defaultdict
,它采用一个“工厂”函数,如果密钥不存在,该函数将被调用,int
用作因子:
from collections import defaultdict
dct = defaultdict(int)
for k, v in lst:
dct[k] += v
注意:创建一个常规的字典通常更安全,以避免默认行为:
dct = dict(dct)
甚至
dct.default_factory = None
最后,更灵活的方法之一是创建自己的dict
子类并使用__missing__
,如果在设置默认值时需要访问键,这很有用,所以在这里不是特别有用,但为了完成:
class AggDict(dict):
def __missing__(self, key):
return 0
dct = AggDict()
for k, v in dct:
dct[k] += v
推荐阅读
- excel - How to use column of strings to find that same string in another sheet, and paste a corresponding value from sheet 1 next to the found value?
- javascript - 如何在 WebStorm 中使用 jsconfig 路径?
- azure-devops - 递增版本号 android 或 iOS 类库 azure devops
- laravel - 如何在 laravel 中处理 InvalidSignatureException 异常并返回自定义错误 json 响应
- spring-data-rest - 向所有 Spring Data Rest 控制器添加方法
- java - 如何将python表达式转换为android?
- java - Maven Assembly插件fileMode在fileSet上不起作用
- apache-nifi - ExecuteSQL 和 ExecuteSQLRecord 之间的区别
- javascript - 转换适用于 Google Maps Api 的 JSON 响应
- gulp - Browsersync 不注入 css