【问题标题】:What is the easiest way to increment a dictionary without using a for-loop?在不使用 for 循环的情况下增加字典的最简单方法是什么?
【发布时间】:2020-09-23 15:46:52
【问题描述】:

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

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 循环。有可能吗?

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案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})
    

    【讨论】:

    • 可以简化为 Counter(x.upper() for x in car) - 不需要方括号,因为 Counter 接受任何可迭代对象,包括生成器表达式。
    • @FMc 虽然您可以消除括号,但使用括号的代码更快,因为它不必先构建列表。 timeit 显示在这种情况下,方括号的速度提高了约 7%。使用括号是一个好习惯,尤其是。对于庞大的列表。
    • 感谢您的快速回复。我现在正在自己尝试。我试图了解您为什么使用地图。至于不使用括号@MarkTolonen,我认为理解总是使用它们?我理解错了吗?
    • @AnthonyAldea 列表推导使用括号,生成器不使用。生成器在迭代时一个接一个地生成项目。有关列表比较与生成器的讨论,请参阅stackoverflow.com/questions/47789/…
    • @FMc This is the answer 我正在考虑先建立列表。 .join() 对生成器效率低下的数据进行两次传递。因此,更有可能是带有 yield 的调用帧的开销使 Counter 的生成器变慢了一点,它可能只执行一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多