gpt4 book ai didi

python - 计算元组列表中项目的频率

转载 作者:太空狗 更新时间:2023-10-29 17:16:26 25 4
gpt4 key购买 nike

我有一个元组列表,如下所示。我必须计算有多少项目的数字大于 1。到目前为止我编写的代码非常慢。即使有大约 10K 的元组,如果你看到下面的示例字符串出现两次,那么我必须得到这样的字符串。我的问题是通过迭代生成器来实现字符串计数的最佳方法是什么

列表:

 b_data=[('example',123),('example-one',456),('example',987),.....]

到目前为止我的代码:

blockslst=[]
for line in b_data:
blockslst.append(line[0])

blocklstgtone=[]
for item in blockslst:
if(blockslst.count(item)>1):
blocklstgtone.append(item)

最佳答案

从每个元组中提取第一项的想法是正确的。您可以使用列表/生成器理解使您的代码更简洁,如下所示。

从那时起,查找元素频率计数的最惯用方法是使用 collections.Counter 对象。

  1. 从元组列表中提取第一个元素(使用理解)
  2. 将此传递给Counter
  3. example的查询次数
from collections import Counter

counts = Counter(x[0] for x in b_data)
print(counts['example'])

当然,您可以使用 list.count 如果您只想为 一个 项目查找频率计数,但在一般情况下,Counter 是要走的路。


Counter 的优点是它以线性 (O( N)) 时间。假设您还想查询另一个元素的计数,比如 foo。这将通过 -

print(counts['foo'])

如果列表中不存在 'foo',则返回 0

如果你想找到最常见的元素,调用counts.most_common -

print(counts.most_common(n))

其中 n 是您要显示的元素数。如果您想查看所有内容,请不要传递 n


要检索最常见元素的计数,一种有效的方法是查询 most_common,然后使用 itertools 高效地提取所有计数超过 1 的元素。

from itertools import takewhile

l = [1, 1, 2, 2, 3, 3, 1, 1, 5, 4, 6, 7, 7, 8, 3, 3, 2, 1]
c = Counter(l)

list(takewhile(lambda x: x[-1] > 1, c.most_common()))
[(1, 5), (3, 4), (2, 3), (7, 2)]

(OP 编辑​​)或者,使用列表理解 来获取计数 > 1 -

的项目列表
[item[0] for item in counts.most_common() if item[-1] > 1]

请记住,这不如 itertools.takewhile 解决方案有效。例如,如果您有一个计数 > 1 的项目,以及一百万个计数等于 1 的项目,您最终会在列表上迭代一百万零一次,而您不必这样做(因为 most_common 按降序返回频率计数)。使用 takewhile 时情况并非如此,因为一旦 count > 1 的条件变为假,您就会停止迭代。

关于python - 计算元组列表中项目的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47843707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com