将项目分组到bucket的简单方法

2024-04-29 22:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常想用python存储一个无序的集合。^{}做了正确的排序,但几乎总是需要先对项进行排序,然后在使用迭代器之前捕获它们。

有没有什么快速的方法可以通过标准的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]}

Tags: 模块方法lambdainfalsetrue标准bucket
1条回答
网友
1楼 · 发布于 2024-04-29 22:21:44

当谓词是布尔值时,这里有一个上面的partition()变体,避免了dict/defaultdict的开销:

def boolpartition(seq, pred):
    passing, failing = [], []
    for item in seq:
        (passing if pred(item) else failing).append(item)
    return passing, failing

示例用法:

>>> even, odd = boolpartition([1, 2, 3, 4, 5], lambda x: x % 2 == 0)
>>> even
[2, 4]
>>> odd
[1, 3, 5]
网友
2楼 · 发布于 2024-04-29 22:21:44

这里有一个简单的两行

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

编辑:

为了完整起见,只需添加另一个案例。

d={}
for x in xrange(21): d.setdefault(x%10, []).append(x)
网友
3楼 · 发布于 2024-04-29 22:21:44

这在(1)(2)(3)之前出现过好几次,在^{} recipes中有一个分区配方,但据我所知,在标准库中什么都没有。。虽然几周前我被accumulate吓了一跳,但谁知道这几天潜伏着什么呢?:^)

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

from collections import defaultdict

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

继续我的生活。

相关问题 更多 >