python - 计算对象列表中有多少对象与属性值的方面相似
问题描述
这是我的示例代码:
import random
class Test:
def __init__(self, pin, name):
self.Pin = pin
self.Name = name
objects = []
myPinList = [123, 323, 1234, 123, 12314, 1234, 1231, 5754, 5456, 4245, 6573, 5743, 567, 563]
objects.append(Test(random.choice(myPinList), "Jhon"))
objects.append(Test(random.choice(myPinList), "Nimra"))
objects.append(Test(random.choice(myPinList), "Thomas"))
objects.append(Test(random.choice(myPinList), "Treesa"))
objects.append(Test(random.choice(myPinList), "Newt"))
objects.append(Test(random.choice(myPinList), "Greny"))
现在我想计算具有相同 PIN 属性值的对象的总数。
objects_having_same_Pin = ???
我搜索了很多,但找不到 pythonic 方法来做到这一点。
解决方案
你可以collections.Counter
在这里使用:
cnts = Counter([i.Pin for i in objects])
# Counter({1231: 2, 1234: 1, 5456: 1, 5743: 1, 6573: 1})
然后,如果您想要一个总数,只需将所有大于一的值相加:
'{} users share a Pin'.format(sum([i for _, i in cnts.items() if i > 1]))
# '2 users share a Pin'
如果您想知道谁共享 pin,您可以使用collections.defaultdict
:
dct = defaultdict(list)
for obj in objects:
dct[obj.Pin].append(obj.Name)
# defaultdict(list,
# {1231: ['Jhon', 'Thomas'],
# 1234: ['Nimra'],
# 5456: ['Treesa'],
# 5743: ['Newt'],
# 6573: ['Greny']})
推荐阅读
- c# - 一个看似简单的 RaycastALL 统一问题我想不通
- python - 虽然循环“继续”在尝试中不起作用,但最终除外
- next.js - 尝试将 Nextjs 部署到 Vercel 时出现错误
- windows - 我刚买了一台装有 Windows 10 的新电脑,每次尝试打开 GitBash 时都会出现错误消息
- python - 在 Keras 中合并多个模型(张量流)
- java - 本地依赖 Exoplayer 模块
- mongodb - 如何在 Mongo 中计算多维数组上的元素?
- html - 我想使用来自本地视频库而不是文件系统的节点 js 流式传输视频
- spacy-3 - 无法将旧的 spacy 2.0 数据转换为新的 spacy 3.0 可接受的格式
- elasticsearch - DeleteByQueryRequest 套接字超时异常 - java 高级别的客户端 api