在dict理解中,有什么方法可以理解dict理解吗?

时间:2016-02-09 09:18:56

标签: python dictionary-comprehension

我有这段代码:

position = {}
for x in range(imdim[0]-shapesize+1):
  for y in range(imdim[1]-shapesize+1):
    curim = im[x:x+shapesize,y:y+shapesize]
    shapedict = {}
    for shapeid,(shape,contour) in enumerate(zip(shapes,contours)):
      values = {}
      curshape = curim[shape]
      curcontour = curim[contour]
      values['meandiff'] = curshape.mean()-curcontour.mean()
      values['maxmin'] = int(curshape.min())-int(curcontour.max())
      shapedict[shapeid] = values
    position[(x,y)] = shapedict
return position

...其中im是一个图像(numpy数组),imdim它的形状,形状和轮廓是比im更小的二维数组列表(shapesize * shapesize)。

它确实有效,但我想知道是否有一种方法可以在词典理解,初始风格中写出所有这些内容。如果是,它会跑得更快吗?

此外,欢迎任何关于样式或优化的评论!

1 个答案:

答案 0 :(得分:1)

我认为这应该做,但我没有真正测试它:

position = {
    (x, y): {
        shapeid: {'meandiff': curim[shape].mean() - curim[contour].mean(),
                  'maxmin': int(curim[shape].min()) - int(curim[contour].max())}
        for shapeid,(shape,contour) in enumerate(zip(shapes,contours))
    }
    for (x,y,curim) in ((x, y, im[x:x+shapesize, y:y+shapesize])
            for x in range(imdim[0]-shapesize+1) 
            for y in range(imdim[1]-shapesize+1)
    )
}

棘手的部分是您定义的临时变量。对于curim,我创建了一个内部生成器表达式,否则您必须将该表达式写入四次。您可以对curshapecurcontour执行相同的操作,但我认为它不值得额外的嵌套级别。

它是否更快:可能不是,当然不是很明显。恕我直言,更重要的是代码的可读性。这当然是一个意见问题。就个人而言,我认为它比原始代码更具可读性。