我有一个带有100个键的字典d
,其中值是可变长度列表,例如
In[165]: d.values()[0]
Out[165]:
[0.0432,
0.0336,
0.0345,
0.044,
0.0394,
0.0555]
In[166]: d.values()[1]
Out[166]:
[0.0236,
0.0333,
0.0571]
以下是我想要做的事情:对于d.values()
中的每个列表,我想将值组织到10个区间(如果值满足条件,则将值放入bin中,例如介于0.03和0.04之间,0.04和0.05之间等。
我最终想要的是与d
完全相同的内容,但不是d.values()[0]
是一个数字列表,我希望它是一个列表列表,如下:
In[167]: d.values()[0]
Out[167]:
[[0.0336,0.0345,0.0394],
[0.0432,0.044],
[0.0555]]
每个密钥仍然与相同的值相关联,但它们将被构造成10个区间。
我一直在疯狂使用嵌套for循环和if / elses等。最好的方法是什么?
编辑:大家好。只是想让你知道我解决了我的问题。我使用了@Brent Washburne的答案。谢谢你的帮助!答案 0 :(得分:2)
您可以通过传递正确的按键功能来使用neww
功能,以便对项目进行分类。在这种情况下,您可以使用itertools.groupby()
作为关键功能:
floor(x*100)
要将此值应用于您的值,您可以使用词典理解:
>>> from math import floor
>>> from itertools import groupby
>>> lst = [0.0432, 0.0336, 0.0345, 0.044, 0.0394, 0.0555]
>>> [list(g) for _,g in groupby(sorted(lst), key=lambda x: floor(x*100))]
[[0.0336, 0.0345, 0.0394], [0.0432, 0.044], [0.0555]]
作为另一种在执行速度方面更优化的方法,您可以使用字典进行分类:
def categorizer(val):
return [list(g) for _,g in groupby(sorted(lst), key=lambda x: floor(x*100))]
new_dict = {k:categorizer(v) for k,v in old_dict.items()}
答案 1 :(得分:2)
def bin(values):
bins = [[] for _ in range(10)] # create ten bins
for n in values:
b = int(n * 100) # normalize the value to the bin number
bins[b].append(n) # add the number to the bin
return bins
d = [0.0432,
0.0336,
0.0345,
0.044,
0.0394,
0.0555]
print bin(d)
结果是:
[[], [], [], [0.0336, 0.0345, 0.0394], [0.0432, 0.044], [0.0555], [], [], [], []]
答案 2 :(得分:1)
为什么不将值设为一组字典,其中ke是bin指示符,值是该bin中那些项的列表?
yoe会定义
func rollDice() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
for i in 0..<50 {
let x = GKRandomSource.sharedRandom().nextIntWithUpperBound(6)
dispatch_async(dispatch_get_main_queue) {
let texture = dice[0].faces[x]
let action:SKAction = SKAction.setTexture(texture)
pieces[3].runAction(action)
pieces[3].texture = dice[0].faces[x]
NSThread.sleepForTimeInterval(0.1)
print(x)
}
}
}
}
您现在拥有一个词典列表,每个词典都有相应的bin列表。
newd = [{bin1:[], bin2:[], ...binn:[]}, ... ]
newd[0][bin1] = (list of items in d[0] that belong in bin1)
现在相当于从newd[0]
构建的字典,每个键(我称之为bin1,bin2,... binn)包含适合该bin的值列表。因此我们有`newd [0] [bin1],newd [0] [bin2,... new [k] [lastbin]
字典创建允许您在进行时创建适当的键和值列表。如果还没有特定的bin密钥,请创建空列表,然后将值附加到列表将成功。
现在,当您想要识别bin的元素时,可以循环遍历newd列表并提取所需的bin。这允许您在没有创建空列表的情况下拥有没有条目的箱。如果bin键不是newd,则将retrieve设置为返回空列表作为默认值(以避免字典无效键异常)。