【问题标题】:add letter to string at specific position in loop (problem with sort) [duplicate]在循环中的特定位置向字符串添加字母(排序问题)[重复]
【发布时间】:2020-05-23 14:00:32
【问题描述】:

我的排序有问题。想要像

那样对列表进行排序
['asd_1qwer', 'asd_14qwer', 'asd_26qwer', 'asd_5qwer']

我发现我需要在 1 和 5 中添加零。

['asd_01qwer', 'asd_05qwer', 'asd_14qwer', 'asd_26qwer']

不知道如何将它添加到正确的位置,因为asd 不是静态的。

list = ['asd_14qwer','asd_5qwer','asd_26qwer','asd_1qwer']
list.sort()

for i in list:
    tempo = i.split('_')[-1].split('qwer')[0]

    if len(tempo) == 1:
        i[:4] + '0' + i[4:]

编辑 需要在所有标签上添加 0 到 1-9 和 qwer 列表常量。

【问题讨论】:

  • 所有的东西都有相同的前缀吗?如果不是,你想只用数字排序还是用数字和前缀排序?如:abc_1, xyz_2, abc_3abc_1 abc_3 xyz_2?
  • 我需要全名。 qwer 没有改变。需要为 PyPDF2 正确排序列表。我只需要对数字进行排序。忘了说。
  • qwer 在每个字符串中都是常量。如果字符串包含15,则需要添加0 对吗??
  • @Ch3steR 需要将 0 添加到 1-9。 qwer 是常数

标签: python python-3.x


【解决方案1】:

实际上,如果您的目标是根据字符串的数字部分对列表进行排序,您不需要对这些数字部分进行零填充,您只需向sort()提供提取数字的键功能部分为整数:

l = ['asd_14qwer','asd_5qwer','asd_26qwer','asd_1qwer']
l.sort(key=lambda x: int(x.split('_')[-1].rstrip('qwer')))

请注意,此代码不依赖于_ 前面的字符,仅依赖于数字部分在_qwer 之间这一事实。

【讨论】:

    【解决方案2】:

    也许是“自然排序”

    import re
    def natsort(lst):
        """natural sort"""
        lst = [str(i) for i in lst]
        import re
        convert = lambda text: int(text) if text.isdigit() else text
        a_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
        return sorted(lst, key=a_key)
    
    
    lst = ['asd_1qwer', 'asd_14qwer', 'asd_26qwer', 'asd_5qwer']
    
    natsort(lst)
    Out[3]: ['asd_1qwer', 'asd_5qwer', 'asd_14qwer', 'asd_26qwer']
    

    【讨论】:

      【解决方案3】:

      请不要隐藏内置名称。我在下面将list 重命名为my_list。 :)

      此外,根据您在 cmets 中的回答,您的方法大多是正确的,但如果您仅使用数字进行排序,则无需添加填充 0 - 您只需将该部分解析为数字!无论长度是 3、21 还是 111,它都会正确排序。

      sort 函数有一个参数key,您可以在其中设置应该用于对列表中的元素进行排序的参数 - 这就是我们需要放置提取和解析数字的 sn-p 的位置:

      my_list = ['asd_14qwer','asd_5qwer','asd_26qwer','asd_1qwer']
      my_list.sort(key=lambda word: int(word.split('_')[-1].split('qwer')[0]))
      

      如您所见,sn-p 与您尝试的类似 - 我只是将它包装在 int 调用中。 :)

      结果:

      ['asd_1qwer', 'asd_5qwer', 'asd_14qwer', 'asd_26qwer']
      

      【讨论】:

        【解决方案4】:

        您也可以在不添加零的情况下进行排序:

        list = ['asd_14qwer','asd_5qwer','asd_26qwer','asd_1qwer']    
        list.sort(key=lambda i: int(i[(i.index('_') + 1):-4]))
        print(list)
        

        输出:

        ['asd_1qwer', 'asd_5qwer', 'asd_14qwer', 'asd_26qwer']
        

        【讨论】:

          【解决方案5】:

          你可以使用:

          my_list.sort(key=lambda x: int(x[4:][:-4]))
          

          或者你可以使用正则表达式:

          import re
          
          my_list.sort(key=lambda x: int(re.search(r'\d+', x).group()))
          

          【讨论】:

            【解决方案6】:
            for i in range(len(list)):
                if len(list[i])==9:
                    list[i] = list[i][:4]+'0'+list[i][4:]
            

            这将在列表中所需的位置添加零

            【讨论】:

            • 感谢您的帮助,但 asd 不是恒定的。
            • 你的意思是用不同的变长字符串代替asd?
            猜你喜欢
            • 2014-04-04
            • 1970-01-01
            • 2017-09-01
            • 2017-09-25
            • 2013-11-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-17
            相关资源
            最近更新 更多