我经常想在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]}发布于 2012-10-04 12:44:08
发布于 2012-10-04 12:33:46
这是一个简单的两行代码
d = {}
for x in "thequickbrownfoxjumpsoverthelazydog": d.setdefault(x in 'aeiou', []).append(x)编辑:
只是为了完整而添加你的另一个案例。
d={}
for x in xrange(21): d.setdefault(x%10, []).append(x)发布于 2015-01-26 20:16:35
当谓词为布尔值时,这里是上面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]https://stackoverflow.com/questions/12720151
复制相似问题