【问题标题】:Sorting a list and dict keys排序列表和字典键
【发布时间】:2015-05-31 20:13:46
【问题描述】:

我使用的是 python 2.7,我有这个列表:

photos = ['arthur20.jpg', 'arthur7.jpg', 'arthur11.jpg', 'arthur3.jpg', 'arthur5.jpg', 'arthur17.jpg', 'arthur15.jpg', 'arthur2.jpg', 'arthur13.jpg', 'arthur8.jpg', 'arthur9.jpg', 'arthur18.jpg', 'arthur4.jpg', 'arthur6.jpg', 'arthur10.jpg', 'arthur12.jpg', 'arthur14.jpg', 'arthur19.jpg', 'arthur16.jpg', 'arthur1.jpg']

如何组织这个列表?我尝试使用sort(),但它不起作用,它返回给我:

['arthur1.jpg', 'arthur10.jpg', 'arthur11.jpg', 'arthur12.jpg', 'arthur13.jpg', 'arthur14.jpg', 'arthur15.jpg', 'arthur16.jpg', 'arthur17.jpg', 'arthur18.jpg', 'arthur19.jpg', 'arthur2.jpg', 'arthur20.jpg', 'arthur3.jpg', 'arthur4.jpg', 'arthur5.jpg', 'arthur6.jpg', 'arthur7.jpg', 'arthur8.jpg', 'arthur9.jpg']

列表中的字符串也是字典的键,我也必须按顺序排列键,如下所示:

dict = {"arthur1.jpg":1, "arthur2.jpg":2 ...}

【问题讨论】:

  • 虽然接受的答案含蓄地表明了这一点——这个问题将受益于“它不起作用”的扩展——它在什么方面不起作用?一个简化的输入列表和它的排序顺序将澄清这一点,并以某种方式制作minimal, complete and verifiable example
  • 哦,对了,对不起,下次我会更小心的。原因是当我对我的“照片”使用 sort() 函数时,名称仍然不按顺序排列:[“arthur10.jpg”、“arthur8.jpg”、“arthur7.jpg” , "arthur6.jpg","arthur5.jpg", "arthur20.jpg", arthur19.jpg", "arthur18.jpg", "arthur17.jpg" ...]。列表中会按顺序排列分段。
  • 是的 - 我知道你看到的顺序是字典 - 所以你会看到例如['arthur1','arthur10','arthur11','arthur2'...] 排序后。这里的想法是,您以一种对未来读者和潜在回答者来说很清楚的方式提出问题 - 这就是为什么我建议您进行编辑,否则该问题可能会被关闭,因为它不符合这些标准。查看how to ask 了解所有这些的官方线路 - 我刚刚通过近距离投票审核队列提出了您的问题,并认为我可以提供一些建议。
  • 好的,谢谢,我下次会更仔细和详细的

标签: python list python-2.7 dictionary


【解决方案1】:

sort() 将按照自然顺序对列表进行排序,在本例中为字典顺序。您可以使用自定义排序功能按“亚瑟”后面的数字对其进行排序。恕我直言,最简单的方法是使用正则表达式提取数字:

import re
photos.sort(key = lambda x : int(re.findall('\d+', x)[0]))

列表排序后,创建您想要的dict 只需ziping:

from collections import OrderedDict
dict = OrderedDict(zip(photos, range(1, len(photos) + 1)))

【讨论】:

    【解决方案2】:

    我认为您可能正在寻找 natsort 包,它可以处理这些更复杂的排序,其中通常的字典排序将失败,因为数字的长度没有标准化。

    >>> natsorted(['arthur20.jpg', 'arthur7.jpg', 'arthur11.jpg', 
                   'arthur3.jpg', 'arthur5.jpg', 'arthur17.jpg', 
                   'arthur15.jpg', 'arthur2.jpg', 'arthur13.jpg',
                   'arthur8.jpg', 'arthur9.jpg', 'arthur18.jpg', 
                   'arthur4.jpg', 'arthur6.jpg', 'arthur10.jpg',
                   'arthur12.jpg', 'arthur14.jpg', 'arthur19.jpg',
                   'arthur16.jpg', 'arthur1.jpg'])
    ['arthur1.jpg', 'arthur2.jpg', 'arthur3.jpg', 'arthur4.jpg', 
     'arthur5.jpg', 'arthur6.jpg', 'arthur7.jpg', 'arthur8.jpg', 
     'arthur9.jpg', 'arthur10.jpg', 'arthur11.jpg', 'arthur12.jpg',     
     'arthur13.jpg', 'arthur14.jpg', 'arthur15.jpg', 'arthur16.jpg',
     'arthur17.jpg', 'arthur18.jpg', 'arthur19.jpg', 'arthur20.jpg']
    

    【讨论】:

      【解决方案3】:
      import collections
      
      origdict = {
              4: "four",
              5: "five",
              1: "one",
              2: "two"
          }
      od = collections.OrderedDict()
      
      for key in sorted(origdict.keys()):
          od[key] = origdict[key]
      
      print od
      

      【讨论】:

      • 这个对于像我这样的初学者来说是一个可以理解的答案
      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2018-07-08
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多