python:由先前函数错误生成的参数

时间:2014-09-18 01:10:10

标签: python json dictionary

所以这可能很简单,但让我感到困惑。

我有一个函数,它接收一个JSON格式的txt文件,并按带宽的降序对其进行排序。功能是:

def sort_guards_with_input(guards):
json_source = json.dumps(guards)
data = json.loads(str(json_source))
data['relays'].sort(key=lambda item: item['bandwidth'], reverse=True)
data = json.dumps(data)
return data

segundo = sort_guards_with_input("the original txt file")

..然后返回表单的排序文件(让我们称之为TEXT):

{"relays": [{"nickname": "Snowden4ever pd7wih1gdUU8bLhWsvH6QHDWfs8", 
"bandwidth": 201000, "type": ["Fast", "Guard", "HSDir", "Named", "Running", 
"Stable", "V2Dir", "Valid"]},{"nickname": "rmblue jMdIu0VZYE+S2oeHShQBAHsdj80",
"bandwidth": 8, "type": ["Fast", "Guard", "HSDir", "Running", "Stable", "Unnamed", 
"V2Dir", "Valid"]}]}

现在我有一个功能可以拉出banwidth和昵称并创建一个列表。功能是:

def get_sorted_names_bw(guards):
  sorted_guards_bw = list(entry['bandwidth'] for entry in guards["relays"])
  sorted_guards_names = list(d['nickname'] for d in guards["relays"])
  temps = [None]*(len(sorted_guards_bw)+len(sorted_guards_names))
  temps[::2] = sorted_guards_bw
  temps[1::2] = sorted_guards_names
  sorted_grds_w_names = [temps[i:i+2] for i in range(0, len(temps), 2)]
  return sorted_grds_w_names

问题是当我尝试通过执行以下操作打印get_sorted_names_bw的结果时:

print get_sorted_names_bw(segundo)

..我收到错误:

  

sorted_guards_bw = list(条目['带宽']用于守卫进入["继电器"])

     

TypeError:字符串索引必须是整数,而不是str

但是,如果我尝试打印get_sorted_names_bw的结果并复制并粘贴TEXT作为参数,则返回结果(错误的一个因为昵称和带宽混淆了,这是另一个问题我会...处理我自己,除非读者感觉非常善良,并且也想帮助它:))。即:

[[201000, 'rmblue jMdIu0VZYE+S2oeHShQBAHsdj80'], [8, 'Snowden4ever pd7wih1gdUU8bLhWsvH6QHDWfs8']]

当我尝试使用先前函数生成的参数但在复制和粘贴参数时不会出错时,为什么会出现错误?

感谢并为这篇长篇文章感到抱歉。

1 个答案:

答案 0 :(得分:1)

您的函数sort_guards_with_input将数据转储到JSON字符串并返回该字符串。但是get_sorted_names_bw假设它正在接收实际数据(作为dict),而不是它的字符串表示。最简单的事情可能是让sort_guards_with_input返回data而不将其转储到JSON。那就是:

def sort_guards_with_input(guards):
    json_source = json.dumps(guards)
    data = json.loads(str(json_source))
    data['relays'].sort(key=lambda item: item['bandwidth'], reverse=True)
    return data