按2个属性将python对象列表分组

sha*_*ane 1 python list-comprehension

我有一个对象列表,即

class A:
    int b
    int c
Run Code Online (Sandbox Code Playgroud)

所以

a = A(b=1, c=2)
b = A(b=4, c=2)
...
Run Code Online (Sandbox Code Playgroud)

我有这些的清单

[a, b, c, d, ..., n]
Run Code Online (Sandbox Code Playgroud)

如何将这个列表分为几组,在每组中,对象在我选择的两个或多个属性之间具有相等性。所以如果我有

e = A(b=3, c=5)
h = A(b=3, c=5)
Run Code Online (Sandbox Code Playgroud)

这些将被组合到一个列表或其他结构中(可能设置吗?)

Luk*_*raf 7

使用itertools.groupby()

例如:

from itertools import groupby

class A(object):

    def __init__(self, b, c):
        self.b = b
        self.c = c


items = [A(1, 2), A(1, 2), A(1, 2), A(2, 2), A(3, 4), A(3, 4), A(5, 6)]

groups = groupby(items, lambda a: (a.b, a.c))

for key, group in groups:
    print "Key: %s, Number of items: %s" % (key, len(list(group)))
Run Code Online (Sandbox Code Playgroud)

输出:

Key: (1, 2), Number of items: 3
Key: (2, 2), Number of items: 1
Key: (3, 4), Number of items: 2
Key: (5, 6), Number of items: 1
Run Code Online (Sandbox Code Playgroud)

因此,键功能(lambda a: (a.b, a.c))在这种情况下是一个组成A.bA.c成一个单一的键(两个值的元组)。