Python 在不使用for循环的情况下增加字典的最简单方法是什么?

Python 在不使用for循环的情况下增加字典的最简单方法是什么?,python,dictionary,list-comprehension,Python,Dictionary,List Comprehension,我正在努力提高我对词典列表理解的理解。我根据我车道上的东西创建了一个愚蠢的列表: car = ['Ram', 'Ford', "Jeep", 'Jeep', 'ram'] 我可以创建一个字典并循环浏览列表 cardict = dict() for count in car: count = count.upper() cardict[count] = cardict.get(count, 0) + 1 print(cardict) 返回 {'RAM': 3

我正在努力提高我对词典列表理解的理解。我根据我车道上的东西创建了一个愚蠢的列表:

car = ['Ram', 'Ford', "Jeep", 'Jeep', 'ram']
我可以创建一个字典并循环浏览列表

cardict = dict()
for count in car:
    count = count.upper()
    cardict[count] = cardict.get(count, 0) + 1
print(cardict)
返回

{'RAM': 3, 'DODGE': 1, 'FORD': 1}
我也一直在努力提高我对理解力的理解。 所以,我也尝试过使用fromkeys()和get()

比如说,

again = dict.fromkeys(cardict, 0) + 1
但是,我得到了一个类型错误。如何浏览字典并增加列表中的项目?我正在寻找“Pythonic”方法来实现这一点,因此我假设有一种方法不需要创建for循环。有可能吗?

这种“Pythonic”方法是使用
集合。计数器
,但您仍然需要列表理解或
映射来更改大小写:

>>> from collections import Counter
>>> car = ['Ram', 'Ford', "Jeep", 'Jeep', 'ram']
>>> Counter(car)
Counter({'Jeep': 2, 'Ram': 1, 'Ford': 1, 'ram': 1})
>>> Counter([x.upper() for x in car])
Counter({'RAM': 2, 'JEEP': 2, 'FORD': 1})
>>> Counter(map(str.upper,car))
Counter({'RAM': 2, 'JEEP': 2, 'FORD': 1})
“Pythonic”方法是使用
collections.Counter
,但您仍然需要列表理解或
map
来更改大小写:

>>> from collections import Counter
>>> car = ['Ram', 'Ford', "Jeep", 'Jeep', 'ram']
>>> Counter(car)
Counter({'Jeep': 2, 'Ram': 1, 'Ford': 1, 'ram': 1})
>>> Counter([x.upper() for x in car])
Counter({'RAM': 2, 'JEEP': 2, 'FORD': 1})
>>> Counter(map(str.upper,car))
Counter({'RAM': 2, 'JEEP': 2, 'FORD': 1})

可以简化为
计数器(x.upper()表示车内x)
–不需要方括号,因为
计数器
接受任何iterable,包括生成器表达式。@FMc虽然可以消除方括号,但使用方括号时代码速度更快,因为它不必首先构建列表
timeit
显示此实例的方括号速度快约7%。使用括号是一个好习惯,特别是对于庞大的列表。感谢您的快速回复。我现在自己在试。我想知道你为什么用地图。至于不使用括号@MarkTolonen,我认为理解总是使用括号?我理解错了吗?@Anthonyaldia列表理解使用括号,生成器不使用括号。生成器在迭代时逐个生成项。有关列表comp与生成器的讨论,请参阅@FMc我想先构建列表
.join()
对数据进行两次传递,这对于生成器来说效率很低。因此,更可能是调用帧的开销和收益率使计数器的生成器速度稍慢,这可能只进行一次传递。可以简化为
计数器(x.upper()表示车内的x)
–不需要方括号,因为
计数器
接受任何可计算的,包含生成器表达式。@FMc如果为true,则可以删除括号,但使用括号时代码速度更快,因为它不必首先生成列表
timeit
显示此实例的方括号速度快约7%。使用括号是一个好习惯,特别是对于庞大的列表。感谢您的快速回复。我现在自己在试。我想知道你为什么用地图。至于不使用括号@MarkTolonen,我认为理解总是使用括号?我理解错了吗?@Anthonyaldia列表理解使用括号,生成器不使用括号。生成器在迭代时逐个生成项。有关列表comp与生成器的讨论,请参阅@FMc我想先构建列表
.join()
对数据进行两次传递,这对于生成器来说效率很低。所以,更可能的是,调用帧的开销和收益率使得计数器的生成器稍微慢一点,而计数器可能只进行一次传递。