猿问

使用字典理解增加字典值

我正在尝试使用 dict 理解和 python 中的三元运算来执行以下表达式:


for num in ar:

     if num in seen_dict:

         seen_dict[num] += 1

     else:

         seen_dict[num] = 1

我试过这个:


seen_dict = { num: seen_dict[num] += 1 for num in ar if num in seen_dict else seen_dict[num] = 1}

及其几个排列,但我不断收到语法错误。可以做我想做的吗?


更新


这是正确的语法,但不是我的 dict 只返回 1: seen_dict = { num: (seen_dict[num] + 1) if num in seen_dict else 1 for num in ar }


有人可以解释为什么这与 for 循环的功能不同吗?谢谢你。


小唯快跑啊
浏览 134回答 3
3回答

红颜莎娜

别。它看起来就像使用字典推导的,这应该是一个不错的主意,但它实际上是一个可怕的陷阱。使用collections.Counter:import countsseen_dict = collections.Counter(ar)或者如果你不想这样做,那就坚持循环。尝试使用 dict 推导式的问题在于,dict 推导式没有很好的方法来维护状态或交错每个键的值的计算。每个值都必须在单个表达式中计算。相比之下,解决计数问题的最佳方法是进行单次传递ar并随时更新每个元素的计数。理解的限制会导致非常低效的尝试,例如seen_dict = {val: ar.count(val) for val in ar}这使得传递的次数ar等于 的长度ar,或者稍微更有效但仍然非常不理想的seen_dict = {val: ar.count(val) for val in set(ar)}只需要len(set(ar))通过,或者对标准库比较熟悉的人,from itertools import groupbyseen_dict = {val: sum(1 for _ in group) for val, group in groupby(sorted(ar))}这至少不是二次时间,但对于 length-n 仍然是 O(nlogn) ar。如果我们使用 input 对这四个片段进行计时list(range(10000)):from collections import Counterfrom itertools import groupbyfrom timeit import timeitar = list(range(10000))print(timeit('Counter(ar)', number=1, globals=globals()))print(timeit('{val: ar.count(val) for val in ar}', number=1, globals=globals()))print(timeit('{val: ar.count(val) for val in set(ar)}', number=1, globals=globals()))print(timeit('{val: sum(1 for _ in group) for val, group in groupby(sorted(ar))}',             number=1, globals=globals()))我们得到以下输出:0.00055301561951637271.05034936964511871.04630589112639430.00422721728682518Counter在半毫秒内完成,而count片段都需要一秒钟。(该set版本似乎具有较低运行时,由于某种首轮效应减缓其他版本;交换的顺序set和非set版本通常逆转这些版本的相对定时的重复数据删除。set没有帮助这个测试,因为输入没有重复。)对于更长的输入,依赖count将更加昂贵。依赖count可能很容易花费数天时间来输入Counter仍然可以在不到一秒的时间内完成。

慕姐4208626

似乎您正在尝试获取列表中所有值的外观。(如果不是,请告诉我。)这是我的处理方法:seen_dict = {num: arr.count(num) for num in list(set(arr))}一个解释:arr.count(num):list.count(element)方法返回elementin的出现次数listset(arr): 创建一个set对象,当它转换回列表时会删除所有重复项,或者换句话说,获取列表的所有不同值list(set(arr)): 中的不同值 arr字典回报将有键值对number- # of appearances of number in arr。
随时随地看视频慕课网APP

相关分类

Python
我要回答