【问题标题】:What is "k for k" for in this def that calculates a mode of a list? [duplicate]在这个计算列表模式的定义中,“k for k”是什么? [复制]
【发布时间】:2021-10-13 12:08:16
【问题描述】:

我在一个关于统计的 yt 视频中看到了这段代码。除了 k for k 部分,我什么都懂

def mode(*args):
    dict_values = {i: args.count(i) for i in args}
    max_list = [k for k, v in dict_values.items() if v == max(dict_values.values())]
    return max_list

【问题讨论】:

  • k for k, v in dict_values.items() 表示从dict_values.items() 中获取k, v 值并从ks 中构建一个列表。
  • 您需要搜索的词是list comprehension
  • 将列表理解转换为for 循环,我想你会明白的。
  • for k, v in dict_values.items(): ...

标签: python statistics


【解决方案1】:

这不是真正的k for k,也许在没有列表理解的情况下编写等效代码会有所帮助:

max_list = []

for k, v in dict_values.items():
    if v == max(dict_values.values()):
        max_list.append(k)

所以,我们创建一个列表,遍历字典中的键/值对,如果值等于字典中的最大值,则存储键。

请注意,此代码非常高效,因为它会在每次迭代中再次计算最大值。你应该只计算一次。 计数也非常低效,因为它再次计数每个值,而不是每个唯一值。

这是我能想象到的最糟糕的实现。

这个怎么样:

from collections import Counter

def mode(*args):
    counter = Counter(args)
    _, max_count = counter.most_common(1)[0]
    max_list = []
    for elem, count in counter.most_common():
        if count < max_count:
             break
        max_list.append(elem)
    return max_list

随机抽取 2000 个 ascii 字符并进行比较:

In [5]: elements = random.choices(string.ascii_letters, k=2000)

In [6]: %timeit mode(*elements)
67.8 µs ± 103 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [7]: %timeit mode_horrible(*elements)
43.4 ms ± 96.6 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

因此,您发布的代码几乎慢了 1000 倍,而且随着元素的增多,它只会变得更糟。

【讨论】:

  • 计数也是低效的。到处都是坏事
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2023-01-19
  • 2011-06-13
相关资源
最近更新 更多