python - 如何按变量对对象进行分组?
问题描述
我想弄清楚是否有一种简单的方法可以通过变量对一些对象进行分组?
我试图遍历对象,创建单独的集合然后再次创建新对象,但我觉得我的方法太复杂了,有没有常见的简单方法?
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
dogs = [Dog('Buddy', 3), Dog('Max', 3), Dog('Charlie', 5),
Dog('Cooper', 1), Dog('Jack', 3),Dog('Rocky', 4), Dog('Bear', 1),
Dog('Duke', 3), Dog('Ace', 5)]
grouped_dogs = [(Dog('Buddy', 3), Dog('Max', 3), Dog('Duke', 3)),
(Dog('Charlie', 5)), (Dog('Cooper', 1), Dog('Bear', 1)),
(Dog('Rocky', 4))] # expected output
我希望它最终能像grouped_dogs一样按年龄来解决。
解决方案
您可以使用key
变量对您的狗进行排序,然后使用itertools 模块中的groupby函数:
from itertools import groupby
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return (self.name, self.age)
dogs = [Dog('Buddy', 3), Dog('Max', 3), Dog('Charlie', 5),
Dog('Cooper', 1), Dog('Jack', 3),Dog('Rocky', 4), Dog('Bear', 1),
Dog('Duke', 3), Dog('Ace', 5)]
sorted_dogs = sorted(dogs, key=lambda x: x.age)
print([(d.name, d.age) for d in sorted(dogs, key=lambda x: x.age)])
for u, v in groupby(sorted_dogs, key=lambda x: x.age):
print(u, [(d.name, d.age) for d in v])
[('Cooper', 1), ('Bear', 1), ('Buddy', 3), ('Max', 3), ('Jack', 3), ('Duke', 3), ('Rocky', 4), ('Charlie', 5), ('Ace', 5)]
1 [('Cooper', 1), ('Bear', 1)]
3 [('Buddy', 3), ('Max', 3), ('Jack', 3), ('Duke', 3)]
4 [('Rocky', 4)]
5 [('Charlie', 5), ('Ace', 5)]
推荐阅读
- javascript - Vue 3 - 带有全局组件的“无法解析组件”
- python - 将图像 (JPEG) 转换为 PDF
- ipa - freeipa 从 v3 迁移到 v4
- python - 在 Python 中迭代的最佳对象类型
- javascript - 具有单个值的多个键名的 JSON 对象。我怎么读?
- google-app-engine - 将 webapp 连接到用户的 BigQuery 项目
- python - 为什么谷歌不推荐使用supervisord作为容器?在 kubernetes 中运行时,supervisord 是否能很好地处理 PID 1 问题?
- algorithm - 算法不是多项式递增
- html - 仅在将鼠标悬停在图像上时才会出现的图像上方文本
- batch-file - 无法在 Window cmd 的 If 块中将变量设置为另一个变量