【问题标题】:Retrieve properties of a class instance stored in a dictonary检索存储在字典中的类实例的属性
【发布时间】:2014-05-10 10:33:31
【问题描述】:

在阅读了wonderful article 关于通过使用内置迭代器和隐式循环在 Python 中加速循环之后,我在我的代码中进行了尝试。它在许多部分都运行良好,但一小部分仍然让我烦恼 - 我迭代的值有时存储为作为字典值的类的字段,我无法摆脱循环遍历我的字典来检索它们。

这是我的代码的简化版本:

class Pair:
    def __init__(self):
        self.radius = 0.0

indices = [(x, y) for y in range(5) for x in range(5)]
d = {}
for (x, y) in indices:
    d[x, y] = Pair()
    d[x, y].radius = (x ** 2 + y ** 2) ** 0.5

sub_list = [(1, 2), (2, 3), (3, 4)]

values = [d[ind].radius for ind in sub_list] # <-- main problem

print reduce(lambda x, y: x + y, values)

所以字典d 有元组(x, y) 作为键和Pair 实例作为值,我的目标是对给定的sub_list 的半径求和(sub_list 可能是整个字典) .是否有任何“广播”技术,或者标记线中的循环是不可避免的?

顺便说一句 - 我是初学者,所以任何关于代码的有用评论(包括样式和 Pythonish 将不胜感激。

谢谢!

【问题讨论】:

  • @zmo 在他的回答中提到,.radius 的使用是不必要的,因为它可以只是字典值 (d[x, y] = radius)。我注意到这只是示例,在实际代码中我还有更多字段,不能简单地是字典的值。

标签: python for-loop dictionary


【解决方案1】:

你的代码还不错,虽然有一个没用的东西,那就是你的对象对。您也可以将半径作为值存储在 dict 中:

indices = [(x, y) for y in range(5) for x in range(5)]
sub_list = [(1, 2), (2, 3), (3, 4)]

d = {}

for (x, y) in indices:
    d[x, y] = (x ** 2 + y ** 2) ** 0.5

values = [d[ind] for ind in sub_list] # <-- no problem

print reduce(lambda x, y: x + y, values)

我无法摆脱循环遍历我的字典来检索它们。

重读您的代码!您不是在遍历字典,而是在遍历 sub_list!也许这是一个语法问题,下面是你如何重写那个迭代:

values=[]
for ind in sub_list:
    values.append(d[x, y])

想一想,你想要的是为子列表的每个元素获取预先计算的半径值。所以实际上除了迭代子列表之外别无他法!是使用列表推导还是地图,这主要取决于个人喜好,即使列表推导更有效:

>>> timeit.repeat(lambda: [d[ind] for ind in sub_list])
[0.8207108974456787, 0.8075330257415771, 0.788733959197998]
>>> timeit.repeat(lambda: map(lambda ind: d[ind], sub_list))
[1.6066839694976807, 1.630357027053833, 1.755575180053711]

如果您谈论复杂性,请考虑d 的大小为m,而values 的大小为n,那么:

values = [d[ind] for ind in sub_list]

O(n)

【讨论】:

  • 谢谢。也许我受Matlab的影响太大了,但是您所说的是Python中没有“广播”,即不可能将values作为一个整体分配(O(1)),只能通过迭代其元素并分配他们一一(O(n))?
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多