【问题标题】:Sorting list per digits in string按字符串中的数字排序列表
【发布时间】:2016-01-29 09:34:14
【问题描述】:

我有一个dict,就像这样:

IdSet = {
    u'abcd_def_99': [u'Scenario: forth Scenario'],
    u'abcd_def_10': [u'Scenario: eleventh Scenario'],
    u'abcd_def_100': [u'Scenario: second Scenario'],
    u'abcd_def_101': [u'Scenario: ninth Scenario'],
    u'abcd_def_46': [u'Scenario: tenth Scenario', u'Scenario: third Scenario', u'Scenario: fifth Scenario'],
}

我想仅按数字(数字)升序重新组合列表(但仍保留整个 referenceId 和值):

10
46
99
100
101

问题是,sorted(IdSet) 没有按照我想要的顺序组装,但是像这样:

10
100
101
46
99

sorted 方法没有按我想要的方式工作,所以我的代码一定是有问题的。我确实考虑过过滤掉数字,然后排序,如下所示:

    for i, item in enumerate(IdSet.items()):
            item_holder = item[0]
            m = re.search(r'\d+$', item_holder).group()

基本上我想写的是:

for key in dict:
    convert string to its numerical value
    then sort key in ascending order, keeping the values

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: python string dictionary digits sorted


    【解决方案1】:

    如果你的键是一致的,试试这个:

    sorted(IdSet.keys(), key=lambda x: int(x.split('_')[-1]))
    

    【讨论】:

      【解决方案2】:

      请注意,将sorted 应用于dict 将产生list。要获得排序后的dict,您必须转向collections.OrderedDict

      这真的取决于你的钥匙的结构。如果abcd_def_ 是常量,您可以为sorted 使用key 函数。

      来自docs

      key 指定一个参数的函数,用于提取一个 每个列表元素的比较键:key=str.lower。默认 值为 None(直接比较元素)。

      sorted(IdSet, key=lambda x:int(x[9:]))
      

      如果最后一个元素保证是数字:

      sorted(IdSet, key=lambda x:int(x.split("_")[-1))
      

      如果数字可以在表达式中的任何位置,则必须re.search

      sorted(IdSet, key=lambda x:int(re.search(r'\d+', x).group()))
      

      口译员

      >>> IdSet = {u'abcd_def_99': [u'Scenario: forth Scenario'],
           u'abcd_def_10': [u'Scenario: eleventh Scenario'],
           u'abcd_def_100': [u'Scenario: second Scenario'],
           u'abcd_def_101': [u'Scenario: ninth Scenario'],
           u'abcd_def_46': [u'Scenario: tenth Scenario', u'Scenario: third Scenario', u'Scenario: fifth Scenario'],
           }
      
      >>> print sorted(IdSet, key=lambda x:int(x[9:]))
      

      输出

      [u'abcd_def_10', u'abcd_def_46', u'abcd_def_99', u'abcd_def_100', u'abcd_def_101']
      

      正则表达式

      >>> IdSet = {u'abcd_def_99_foo': [u'Scenario: forth Scenario'],
           u'abcd_def_10_foo': [u'Scenario: eleventh Scenario'],
           }
      >>> import re
      >>> print sorted(IdSet, key=lambda x:int(re.search(r'\d+', x).group()))
      

      输出正则表达式

      [u'abcd_def_10_foo', u'abcd_def_99_foo']
      

      将其转换为OrderedDict

      from collections import OrderedDict
      OrderedDict(sorted(IdSet, key=lambda x:int(re.search(r'\d+', x).group())))
      

      【讨论】:

        【解决方案3】:

        这里有两个具体问题

        1. 您需要了解字典没有排序。即使您对其进行排序,它也会按照某种内在顺序重新排列元素。你最好使用OrderedDict

        2. 当您对作为字符串的键进行排序时。字典顺序不同于数字顺序。您应该只考虑数字部分,通过修改键并删除所有内容,除了您希望订购字典键的数字部分。

        实施

        from collections import OrderedDict
        OrderedDict(sorted(IdSet.items(), key = lambda e: int(e[0].split('_')[-1])))
        

        【讨论】:

          猜你喜欢
          • 2020-07-17
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 2014-07-30
          • 2021-01-25
          相关资源
          最近更新 更多