python有partition_by函数吗?

时间:2014-02-08 00:22:44

标签: python

是否有一些根据某些谓词对列表进行分区的既定方法?我想要做的就像一个itertools groupby,但谓词将是一些任意复杂的函数(而不仅仅是一个键)。例如,想象一个学生列表,每个学生都有一个课程列表,我想由那些有共同课程的学生分组。所以它会是这样的:

def coursework_intersection(a,b):
     return set(a['courses']).intersection(b['courses'])

list_of_lists = partition_by(coursework_intersection, students) 

2 个答案:

答案 0 :(得分:2)

如果你想要Joran在评论中所说的那么它本身就是Omega(n ^ 2)最坏情况下的运行时间,因为这是最坏情况下输出的大小(其中coursework_intersection总是返回true)。所以,让我们咬紧牙关:

def associated_with(func, seq):
    for item in seq:
        yield item, (other for other in seq if func(item, other))

请注意,输入是一个序列,而不是可迭代的,因为这是一个多遍算法。

如果我们被允许假设它是一个对称函数,可以优化调用func一半,尽管成本是更多的内存使用。它也可以优化为单行return ( (item, (other for other in seq if func(item, other))) for item in seq),但我判断这不是引入代码最可读的方式; - )

答案 1 :(得分:1)

from collections import defaultdict

def group_by_classes(students):
    result = defaultdict(list)
    for student in students:
        result[set(student["courses"])].append(student)
    return result

将生成每个唯一类集的学生列表(即类超立方体的每个占用顶点)。