按值对Python字典排序-这里有什么问题?
考虑以下Python代码:按值对Python字典排序-这里有什么问题?,python,sorting,dictionary,Python,Sorting,Dictionary,考虑以下Python代码: with open('data.json', 'rb') as fp: data = json.load(fp,encoding="utf-8") list_of_years = [] for datas in data: list_of_years.append(data[datas]['year']) print set(list_of_years) received_letters = {} sent_letters = {} for years i
with open('data.json', 'rb') as fp:
data = json.load(fp,encoding="utf-8")
list_of_years = []
for datas in data:
list_of_years.append(data[datas]['year'])
print set(list_of_years)
received_letters = {}
sent_letters = {}
for years in set(list_of_years):
print years
number_of_sent_letters =0
number_of_received_letters =0
for datas in data:
if (data[datas]['year'] == years):
if ' Luther, Martin' in data [datas] ['sender']:
number_of_sent_letters+=1
print "The number of sent letters:" +str(number_of_sent_letters)
sent_letters[years]=number_of_sent_letters
for datas in data:
if (data[datas]['year'] == years):
if ' Luther, Martin' in data [datas] ['receiver']:
number_of_received_letters+=1
print "The number of received letters:" +str(number_of_received_letters)
received_letters[years]=number_of_received_letters
sent_letters[years] = {number_of_sent_letters}
sorted_sent_letters[years] = sorted(sent_letters[years].iteritems(), key=operator.itemgetter(1))
received_letters[years] = {number_of_received_letters}
sorted_received_letters[years] = sorted(received_letters[years].iteritems(), key=operator.itemgetter(1))
我试图按照另一个关于按值对字典排序的问题的答案中的建议,对两个字典进行排序,分别是收到的字母
和发出的字母
。。。我得到的结果就是错误消息
set对象没有属性iteritems
关于最后一行的第四行
这里怎么了?首先,您说您正在尝试对字典进行排序,但您的代码只尝试对包含单个项的集合进行排序
sent_letters[years] = {number_of_sent_letters}
sorted_sent_letters[years] = sorted(sent_letters[years].iteritems(), key=operator.itemgetter(1))
由于number\u-of-sent\u-letters
是一个整数,sent\u-letters[years]
只是一个单例集合
我想你想做:
sorted_sent_letters = sorted(sent_letters.iteritems(), key=operator.itemgetter(1))
你应该在循环之外做…我很确定你想要的是这个,但我不清楚你想要做什么,因为你在最后生成的是两本字典,每年都与字母数量有关
with open('dataset.json', 'rb') as fp:
dataset = json.load(fp, encoding="utf-8")
set_of_years = {}
for data in dataset:
set_of_years.append(data['year'])
print set_of_years
sent_letters, received_letters = {}, {}
for year in set_of_years:
print year
for data in dataset:
if (data['year'] == year):
if 'Luther, Martin' in data['sender']:
sent_letters[year] += 1
if 'Luther, Martin' in data['receiver']:
received_letters[year] += 1
print "The number of sent letters: %d" % sent_letters[year]
print "The number of received letters: %d" % received_letters[year]
之后,这取决于你想要什么。您已将看起来像排序的内容编码为一个(日期,计数)元组列表,并按第二个值(计数)对其进行排序。如果写得好的话
itemgetter_1 = operator.itemgetter(1)
sorted_sent_letters = sorted(sent_letters.items(), key=itemgetter_1)
sorted_received_letters = sorted(received_letters.items(), key=itemgetter_1)
或者,使用lambdas
count_key = lambda pair: pair[1]
sorted_sent_letters = sorted(sent_letters.items(), key=count_key)
sorted_received_letters = sorted(received_letters.items(), key=count_key)
但似乎更可能的情况是,您只需要一份按字母计数排序的年份列表,因此您需要
count_key = lambda year: data[year]
sorted_sent_letters = sorted(sent_letters, key=count_key)
sorted_received_letters = sorted(received_letters, key=count_key)
我希望这能有所帮助从表面上看,你的压痕是错误的。例如,第二行
data=json.load(fp,encoding=“utf-8”)
应该以空格开头,这样程序就不会编译。如果你有一个正确缩进的版本,那么请发布它,因为我们不能告诉你的意思比编译器更好!我还确信data[datas]['year']
应该是datas['year']
,这可能是您问题的根源。您从打印集(年列表)
获得了什么输出?请修复代码缩进并提供错误的完整追溯。