简体   繁体   English

Python RuntimeError:cmp中超出了最大递归深度

[英]Python RuntimeError: maximum recursion depth exceeded in cmp

I have a complex data structure that I'm trying to process. 我有一个复杂的数据结构,我正在尝试处理。

Explanation of the data structure: I have a dictionary of classes. 数据结构的解释:我有一个类的字典。 The key is a name. 关键是一个名字。 The value is a class reference. 该值是类引用。 The class contains two lists of dictionaries. 该类包含两个字典列表。

Here's a simple example of my data structure: 这是我的数据结构的一个简单示例:

import scipy.stats

class employee_salaries(object):
    def __init__(self,management, players, disparity):
        self.management = management
        self.players = players
        self.disparity = disparity

# the coach's salary was 12 his 1st year and 11 his 2nd year
mgmt1 = [{'Coach':12, 'Owner':15, 'Team Manager': 13}, {'Coach':11, 'Owner':14, 'Team Manager':15}]
plyrs1 = [{'Point Guard': 14, 'Power Forward':16,},{'Point Guard':16, 'Power Forward':18}]

NBA = {}

mgmt2 = [{'Coach':10, 'Owner':12}, {'Coach':13,'Owner':15}]
plyrs2 = [{'Point Guard':17, 'Power Forward':14}, {'Point Guard': 22, 'Power Forward':16}]

NBA['cavs'] = employee_salaries(mgmt1,plyrs1,0)
NBA['celtics'] = employee_salaries(mgmt2,plyrs2,0)

Let's say I wanted to determine the disparity between the Point Guard's salary and the Owner's salary over these two years. 假设我想确定Point Guard的工资与业主在这两年的工资之间的差距。

for key, value in NBA.iteritems():
    x1=[]; x2=[]
    num = len(NBA[key].players)
    for i in range(0,num):
        x1.append(NBA[key].players[i]['Point Guard'])
        x2.append(NBA[key].management[i]['Owner'])
    tau, p_value = scipy.stats.kendalltau(x1, x2)

    NBA[key].disparity = tau
print NBA['cavs'].disparity

Keep in mind this is not my real data. 请记住,这不是我的真实数据。 In my actual data structure, there are over 150 keys. 在我的实际数据结构中,有超过150个密钥。 And there are more elements in the list of dictionaries. 字典列表中还有更多元素。 When I run the code above on my real data, I get a runtime error. 当我在真实数据上运行上面的代码时,我收到运行时错误。

RuntimeError: maximum recursion depth exceeded in cmp error. RuntimeError:cmp错误中超出了最大递归深度。

How can I change the code above so that it doesn't give me a maximum recursion depth error? 如何更改上面的代码,以便它不会给我一个最大的递归深度错误? I want to do this type of comparison and be able to save the value. 我想做这种比较,并能够保存价值。

It's a bug. 这是一个错误。

Fixed in 0.15.0 固定在0.15.0

You're passing in empty arrays, and the function handles it incorrectly. 你传入空数组,函数处理不正确。 Either update your Scipy, or skip if the arrays are empty (though check that your data isn't wrong and that it makes sense to have an empty array there). 更新你的Scipy,或者如果数组是空的则跳过(虽然检查你的数据没有错,并且那里有一个空数组是有意义的)。


Some suggestions for your code. 您的代码的一些建议。

for team in NBA.itervalues():
#Or `for name, team in NBA.iteritems()` if you use the name.
    x1, x2 = [], []
    # Not `x1 = x2 = []`, since that would be two names for one list

    for player, manager in izip(team.players, team.management):
        x1.append(player['Point Guard'])
        x2.append(manager['Owner'])
    # Or lose the `for` loop and say:
    # `x1 = [player['Point Guard'] for player in team.players]`
    # `x2 = [manager['Owner'] for manager in team.management]`
    # (This can be more efficient.)

    tau, p_value = scipy.stats.kendalltau(x1, x2)

    team.disparity = tau

print NBA['cavs'].disparity

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM