将项目分组到存储桶的简单方法

Mu *_*ind 14 python

我经常想在python中存储无序集合.itertools.groubpy做正确的事情,但几乎总是需要按摩来先对物品进行分类,然后在消耗之前捕捉它们.

有没有快速的方法来通过标准的python模块或简单的python习惯来获得这种行为?

>>> bucket('thequickbrownfoxjumpsoverthelazydog', lambda x: x in 'aeiou')
{False: ['t', 'h', 'q', 'c', 'k', 'b', 'r', 'w', 'n', 'f', 'x', 'j', 'm', 'p',
    's', 'v', 'r', 't', 'h', 'l', 'z', 'y', 'd', 'g'],
 True: ['e', 'u', 'i', 'o', 'o', 'u', 'o', 'e', 'e', 'a', 'o']}
>>> bucket(xrange(21), lambda x: x % 10)
{0: [0, 10, 20],
 1: [1, 11],
 2: [2, 12],
 3: [3, 13],
 4: [4, 14],
 5: [5, 15],
 6: [6, 16],
 7: [7, 17],
 8: [8, 18],
 9: [9, 19]}
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 20

这又拿出了前几次- (1) ,(2) ,(3) -并有一个在一个分区配方itertools的食谱,但据我所知,没有什么标准库.虽然我很惊讶,几个星期以前accumulate,所以谁知道这些日子里潜藏着什么?:^)

当我需要这种行为时,我会使用

from collections import defaultdict

def partition(seq, key):
    d = defaultdict(list)
    for x in seq:
        d[key(x)].append(x)
    return d
Run Code Online (Sandbox Code Playgroud)

继续我的一天.


gri*_*eve 6

这是一个简单的两线

d = {}
for x in "thequickbrownfoxjumpsoverthelazydog": d.setdefault(x in 'aeiou', []).append(x)
Run Code Online (Sandbox Code Playgroud)

编辑:

为了完整性,只需添加您的其他案例。

d={}
for x in xrange(21): d.setdefault(x%10, []).append(x)
Run Code Online (Sandbox Code Playgroud)

  • wim:实际上,我比“defaultdict”更喜欢“setdefault”。无论哪种方式,代码量几乎相同,但是“setdefault”对此很明确,您可以在需要时在现有字典上使用它。 (2认同)