在python中分区变量长度列表

时间:2016-02-25 21:47:22

标签: python dictionary binning

我有一个带有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的答案。谢谢你的帮助!

3 个答案:

答案 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设置为返回空列表作为默认值(以避免字典无效键异常)。