按属性和计数对对象进行分组

时间:2017-12-21 18:14:43

标签: python python-3.x

我有一个Animal个对象列表需要按2个属性speciesgender组合在一起,而第三个属性amount需要加起来。

你将如何做到这一点?任何帮助非常感谢!

初始列表

[
    zoo.append(Animal('lion', 'male', 10))
    zoo.append(Animal('lion', 'male', 20))
    zoo.append(Animal('lion', 'female', 50))
    zoo.append(Animal('lion', 'female', 10))
    zoo.append(Animal('eagle', 'male', 1))
    zoo.append(Animal('eagle', 'male', 3))
]

预期清单:

[
    Animal('lion', 'male', 30),
    Animal('lion', 'female', 60),
    Animal('eagle', 'male', 4)
]

尝试失败:

class Animal(object):

    def __init__(self, species, gender, amount):

        self.species = species
        self.gender = gender
        self.amount = amount

# need help with this function 
def simplify(zoo):
    simplifiedZoo = []
    for animal in zoo:
        key = animal.species
        d[key].append(...)

    return simplifiedZoo

# Create initial list
zoo = []
zoo.append(Animal('lion', 'male', 10))
zoo.append(Animal('lion', 'male', 20))
zoo.append(Animal('lion', 'female', 50))
zoo.append(Animal('lion', 'female', 10))
zoo.append(Animal('eagle', 'male', 1))
zoo.append(Animal('eagle', 'male', 3))

# Simplify list
simplify(zoo)

2 个答案:

答案 0 :(得分:2)

您可以使用defaultdict来避免在求和时出现颠簸的密钥存在检查。使用tuples species的{​​{1}}作为关键:

gender

答案 1 :(得分:2)

没有任何图书馆

def simplify(zoo):
    simplifiedZoo = {}
    for animal in zoo:
        try:
          simplifiedZoo[(animal.species, animal.gender)].amount += animal.amount 
        except KeyError:
            simplifiedZoo[(animal.species, animal.gender)] = animal
    return [x for x in simplifiedZoo.values()]