2列表将排序字典排序为2个列表(多个键值)

时间:2015-07-16 14:47:05

标签: python list sorting dictionary key

我正在尝试使用两个列表:一个包含日期,一个包含分数,然后将它们压缩到字典中,然后按键值排序,然后将它们转回两个列表(仍然排序)。我遇到的问题是字典没有保留多个键值。我的代码如下:

date = ['2015/07/13', '2015/07/13', '2015/07/07', '2015/07/06',...] 
#there are 59 of these dates
Scores = [9.5, 13.9, 15.5, 12.9 .... ] #There are 59 of these scores
dictionary = dict(zip(date, Scores)) 
d = sorted(dictionary.items()) 
dte = []
scr = []
for i in d: 
    dte.append(i[0]) 
    scr.append(i[1])

然而,当我打印出这些列表时,长度只有24而不是59,应该是这样。多个相同的键不会退出。我想知道是否有一种简单的方法可以将所有59个已排序的元素放回两个列表中。我看了一些类似的其他python答案,但没有一个对我有用。理想情况下,我不想为日期创建对象(除非这是最简单的方法),但是当我尝试这样做时,我不断收到错误。另外,我使用的是Python 2.7。

4 个答案:

答案 0 :(得分:2)

date, Scores = zip(*sorted(zip(date, Scores)))

答案 1 :(得分:0)

词典不支持相同键的多个副本。您的密钥应该是唯一的。实现此目的的一种方法是使密钥成为日期和分数的元组,除非您在同一天获得相同的分数。在这种情况下,您可以添加编号为0到58的第三个列表,并在排序时将其用作第三个元素(使其成为三元组而不是元组)作为决胜局。

答案 2 :(得分:0)

在这种情况下使用列表可能更有意义:

A = [item * item for item in A] #NOTE: the original list object may survive

输出是两个列表,首先按日期排序(当您使用YYYY / MM / DD时),第二个列表按分数排序。我把两双保持在一起。输出如下:

dates = ['2015/07/13', '2015/07/13', '2015/07/07', '2015/07/06'] 
scores = [9.5, 13.9, 15.5, 12.9] 

ldates_scores = zip(dates, scores)

dte = sorted(ldates_scores)
scr = sorted(ldates_scores, key=lambda x: x[1])

print dte
print scr
print

for date,score in dte:
    print "Date: %-10s   Score: %d" % (date, score)

print

for date,score in scr:
    print "Date: %-10s   Score: %d" % (date, score)

答案 3 :(得分:-1)

dict中的键将是唯一的,因此您只捕获每个日期的单个项目。不需要dict ... zip会返回一个元组然后再排序。

 z = zip(date, Scores)
 sorted(z, key=lambda val: val[1], reverse=True)