Python:通过投影值相等将列表分组到子列表中

是否有一种很好的pythonic方法可以将列表分组到列表列表中,其中每个内部列表只包含那些具有相同投影的元素,由用户定义为函数?

例:

>>> x = [0, 1, 2, 3, 4, 5, 6, 7]
>>> groupby(x, projection=lambda e: e % 3)
[[0, 3, 6], [1, 4, 7], [2, 5]]

我不关心投影本身,只是如果它对某些元素是相等的,那么它们必须最终存在于同一个子列表中.

我基本上正在寻找一个相当于haskell函数GHC.Exts.groupWith的python:

Prelude> import GHC.Exts
Prelude GHC.Exts> groupWith (`mod` 3) [0..7]
[[0,3,6],[1,4,7],[2,5]]
最佳答案
标准库中的itertools模块包含一个groupby()函数,可以执行您想要的操作.

请注意,groupby()的输入应按组键排序,以便只为每个组生成一次,但很容易使用相同的键函数进行排序.因此,如果您的关键功能(投影)正在查看数字是否为偶数,则它看起来像这样:

from itertools import groupby
x = [0, 1, 2, 3, 4, 5, 6, 7]

def projection(val):
    return val % 3

x_sorted = sorted(x, key=projection)
x_grouped = [list(it) for k, it in groupby(x_sorted, projection)]    
print(x_grouped)

[[0, 3, 6], [1, 4, 7], [2, 5]]

请注意,虽然此版本仅使用标准Python功能,但如果您处理的值超过100,000,则应查看pandas(请参阅@ ayhan的回答)

转载注明原文:Python:通过投影值相等将列表分组到子列表中 - 代码日志