【问题标题】:2 Lists to Sorted Dictionary back to 2 Lists (Multiple Key Values)2 个列表到排序字典返回 2 个列表(多个键值)
【发布时间】:2015-07-16 14:47:05
【问题描述】:

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

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。

【问题讨论】:

  • 为什么要使用字典?您可以使用另一个列表[[a1,b1], [a2,b2], ...]
  • FWIW,将每个日期分数对保持在一起是有意义的,元组非常适合。将它们放在单独的列表中可能很危险,因为如果出现问题,列表很容易不同步。
  • 我会记住这一点的!谢谢!我不再处理数据,所以我认为一切都应该很好,但如果我决定改变一些事情,我会将数据分数放在一起

标签: python list sorting dictionary key


【解决方案1】:
date, Scores = zip(*sorted(zip(date, Scores)))

【讨论】:

  • 太棒了,谢谢。现在我只是通过 x[0] 为日期和索引创建一个新列表,并且为 x[1] 创建一个新列表,并且我有两个有序的日期列表及其相应的分数!谢谢!
  • 不推荐纯代码答案!
  • @Christian - 当然,但我不知道会添加什么解释。如果您可以改进我的答案,请随时编辑我的答案,或者窃取我的代码并将其合并到您自己的代码中。
  • @Mike:Robᵩ 的代码以元组的形式返回排序后的数据,但您可以通过 Scores = list(Scores) 将元组转换为列表(如果您真的需要列表)。跨度>
  • @PM2Ring 对,我把它们从一个元组变成了列表。我想要列表,因为我想绘制一些我得到的数据。我只是将 x = 设置为 Rob 所说的内容,然后通过 x[0] 和 x[1] 进行索引以获取列表
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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)
    

    输出是两个列表,第一个按日期排序(因为您使用的是 YYYY/MM/DD),第二个列表按分数排序。我把这对放在一起。输出如下:

    [('2015/07/06', 12.9), ('2015/07/07', 15.5), ('2015/07/13', 9.5), ('2015/07/13', 13.9)]
    [('2015/07/13', 9.5), ('2015/07/06', 12.9), ('2015/07/13', 13.9), ('2015/07/07', 15.5)]
    
    Date: 2015/07/06   Score: 12
    Date: 2015/07/07   Score: 15
    Date: 2015/07/13   Score: 9
    Date: 2015/07/13   Score: 13
    
    Date: 2015/07/13   Score: 9
    Date: 2015/07/06   Score: 12
    Date: 2015/07/13   Score: 13
    Date: 2015/07/07   Score: 15
    

    【讨论】:

    • 确实,很好,已经修复了。
    【解决方案4】:

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

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

    【讨论】:

    • OP 是按键值排序的,即 date 而不是 Score,所以你的 lambda 是不正确的。跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2021-07-19
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多