如何在Python中对列表中的元素进行计数

2024-04-29 16:51:38 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个清单:

[(9600002, 42, 3),
(9600001, 17, 3),
(9600003, 11, 1),
(9600002, 14, 5),
(9600001, 17, 1),
(9600003, 11, 4),
(9600001, 17, 4),
(9600001, 14, 3),
(9600002, 42, 6),
(9600002, 42, 1)] 

第一个数字是用户编号,第二个数字是电视节目编码,第三个数字是季节编号。在

我的问题

我如何找出订阅超过一季的节目编码,然后打印用户id电视节目编码?例如:

^{pr2}$

或者你对我应该应用哪种数据结构有什么建议吗?在


Tags: 用户id数据结构编码数字节目建议编号
2条回答

有很多方法可以完成这项任务

first using detaultdict :

import collections
data=[(9600002, 42, 3),
(9600001, 17, 3),
(9600003, 11, 1),
(9600002, 14, 5),
(9600001, 17, 1),
(9600003, 11, 4),
(9600001, 17, 4),
(9600001, 14, 3),
(9600002, 42, 6),
(9600002, 42, 1)]

d=collections.defaultdict(list)

for i in data:
    d[(i[0],i[1])].append(i)

print(list(filter(lambda x:len(x)>1,d.values())))

输出:

^{pr2}$

Second using itertools groupby :

import itertools

print(list(filter(lambda x:len(x)>1,[list(j) for i,j in itertools.groupby(sorted(data),key=lambda x:(x[0],x[1]))])))

输出:

^{4}$

Third approach

最后,您还可以尝试手动方式,而不是使用任何导入:

d={}

for i in data:
    if (i[0],i[1]) not in d:
        d[(i[0],i[1])]=[i]
    else:
        d[(i[0],i[1])].append(i)

print(list(filter(lambda x:len(x)>1,d.values())))

输出:

^{pr2}$

一种方法是使用collections.Counter。在

其思想是使用字典计算每个(用户、程序)组合的序列数。在

然后通过字典理解过滤大于1的计数。在

from collections import Counter

lst = [(9600002, 42, 3), (9600001, 17, 3), (9600003, 11, 1),
       (9600002, 14, 5), (9600001, 17, 1), (9600003, 11, 4),
       (9600001, 17, 4), (9600001, 14, 3), (9600002, 42, 6),
       (9600002, 42, 1)] 

c = Counter()

for user, program, season in lst:
    c[(user, program)] += 1

print(c)

# Counter({(9600002, 42): 3, (9600001, 17): 3, (9600003, 11): 2,
#          (9600002, 14): 1, (9600001, 14): 1})

res = {k: v for k, v in c.items() if v > 1}

print(res)

# {(9600002, 42): 3, (9600001, 17): 3, (9600003, 11): 2}

print(res.keys())

# dict_keys([(9600002, 42), (9600001, 17), (9600003, 11)])

关于计数器与defaultdict(int)的说明

Counter的速度是defaultdict(int)的两倍,请参阅下面的基准测试。如果性能很重要,并且这些功能都与您无关,您可以轻松切换到defaultdict(int)

  1. 查询时缺少Counterdon't get added automatically。在
  2. 您可以添加/减去Counter对象。在
  3. Counter提供additional methods,例如elementsmost_common。在

Python3.6.2的基准测试。在

^{pr2}$

相关问题 更多 >