如何计算以元组为关键字的字典的欧几里得

时间:2017-03-21 21:35:51

标签: python python-3.x dictionary

我使用以元组为键的字典创建了一个矩阵(例如{(user,place):1})

我需要计算矩阵中每个位置的欧几里得。 我已经创建了一个方法来实现这一点,但它效率非常低,因为它遍历每个地方的整个矩阵。

data

有没有办法更有效地做到这一点? 我需要将结果放在字典中,将地点作为键,将欧几里德作为值。

4 个答案:

答案 0 :(得分:1)

您可以使用字典理解(使用矢量化形式比for循环快得多)并将条件(0或1)的结果累加为欧几里德值:

def calculateEuclidian(self, place):
    return {place: sum(p==place and val==1 for (_,p), val in self.matrix.items())}

根据您当前的数据结构,我怀疑您是否有办法避免遍历整个字典。

答案 1 :(得分:1)

如果你不能使用另一种方式(或辅助方式)表示你的数据,那么遍历dict的每个元素都是有效的(渐近),因为没有办法问一个dict tuple (_, place)为您提供所有符合_键的元素(其中dict[Place, list[User]]表示“任意值”)。编写迭代代码还有其他更简洁的方法,但是你无法摆脱渐近效率的限制。

如果这是您最常用的操作,并且您实际上可以使用其他方式表示数据,则可以使用len(...)代替。这样,您可以在O(1)时间内获取某个位置的所有用户的列表,而您需要做的就是使用sqrt函数计算列表中的项目。 (1)。显然,你仍然需要最终采用$ heroku buildpacks:add heroku/nodejs

答案 2 :(得分:1)

您可能希望从当前字典创建一个新字典,该字典不适合此类搜索,并创建一个以place为键的字典,并将(user,value)元组列表作为值

获取place键下的元组列表(快速),然后计算value为1的时间(线性,但在一小组数据上)

保留原始字典以进行欧几里德距离计算。希望您不要在程序中经常更改数据,因为您需要保持两个序列同步。

答案 3 :(得分:1)

可能有一些方法可以让它更像Pythonic,但我认为你不能改变总体复杂性,因为你根据键和值进行查询。我认为你必须在整个矩阵中搜索你的实例。