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