我经常想在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]}
答案 0 :(得分:19)
之前已多次提出 - (1),(2),(3) - 并且itertools
recipes中有分区配方,但据我所知,没有什么在标准库中..虽然我几周前被accumulate
感到惊讶,所以谁知道这些日子里潜藏着什么? :^)
当我需要这种行为时,我会使用
from collections import defaultdict
def partition(seq, key):
d = defaultdict(list)
for x in seq:
d[key(x)].append(x)
return d
继续我的一天。
答案 1 :(得分:4)
这是一个简单的双线
d = {}
for x in "thequickbrownfoxjumpsoverthelazydog": d.setdefault(x in 'aeiou', []).append(x)
修改强>
只需添加其他案例即可完成。
d={}
for x in xrange(21): d.setdefault(x%10, []).append(x)
答案 2 :(得分:2)
当谓词为布尔值时,以上是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]
答案 3 :(得分:2)
如果 <nav class="navbar navbar-custom">
<div class="container">
<ul class="nav navbar-nav navbar-right">
<li><a href="signup.php"><span class="glyphicon glyphicon-user"></span> Login / Register</a></li>
</ul>
</div>
</nav>
为pandas.DataFrame
,则使用pd.cut()
from sklearn import datasets
import pandas as pd
# import some data to play with
iris = datasets.load_iris()
df_data = pd.DataFrame(iris.data[:,0]) # we'll just take the first feature
# bucketize
n_bins = 5
feature_name = iris.feature_names[0].replace(" ", "_")
my_labels = [str(feature_name) + "_" + str(num) for num in range(0,n_bins)]
pd.cut(df_data[0], bins=n_bins, labels=my_labels)
产生
0 0_1
1 0_0
2 0_0
[...]
如果你没有设置labels
,输出就会像这样
0 (5.02, 5.74]
1 (4.296, 5.02]
2 (4.296, 5.02]
[...]
答案 4 :(得分:-1)
编辑:
使用DSM的答案作为开始,这是一个稍微简洁,一般的答案:
d = defaultdict(list)
map(lambda x: d[x in 'aeiou'].append(x),'thequickbrownfoxjumpsoverthelazydog')
或
d = defaultdict(list)
map(lambda x: d[x %10].append(x),xrange(21))
#
这是两个班轮:
d = {False:[],True:[]}
filter(lambda x: d[True].append(x) if x in 'aeiou' else d[False].append(x),"thequickbrownfoxjumpedoverthelazydogs")
当然可以将其作为单行代码:
d = {False:[],True:[]};filter(lambda x: d[True].append(x) if x in 'aeiou' else d[False].append(x),"thequickbrownfoxjumpedoverthelazydogs")