【问题标题】:How to sort list of string in ascending way?如何以升序方式对字符串列表进行排序?
【发布时间】:2020-09-16 16:44:27
【问题描述】:

我有一个字符串列表。它们实际上是文件。

image_files = ["1.jpg", "3.jpg", "2.jpg", "4.jpg", "6.jpg", "5.jpg", "20.jpg", "29.jpg", "11.jpg", "9.jpg"]

我想对它们进行排序:

['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '9.jpg', '11.jpg', '20.jpg', '29.jpg']

我尝试使用sorted(image_files, key = len),但失败了。

【问题讨论】:

  • 不是升序的,你已经拥有的列表是升序的。问题是您希望字符串是自然排序的,而不是按字典顺序(字母顺序)。看到这个相关的:question。在这种情况下,你可以做类似sorted(image_files, key=lambda x:int(x.partition('.')[0]))

标签: python python-3.x list sorting lambda


【解决方案1】:

按编号排序:

import os

sorted_files = sorted(image_files, key=lambda x: int(os.path.splitext(x)[0]))

您还可以对文件名进行零填充以帮助排序。

【讨论】:

  • 为什么每个人都删除他的答案? split('.') 在这种情况下非常好。我意识到,当前面有多个扩展名或路径名时,splitext 无论如何都无济于事,因为int() 会失败。
  • 就像不想创建重复的答案一样。
  • 嗯,我更喜欢split() 并获得了支持,但一秒钟后它就消失了。 :(
【解决方案2】:

试试这个,

sorted(image_files, key=lambda x : int(x.split(".")[0]))

['1.jpg', '2.jpg', '3.jpg', '4.jpg', ..]

【讨论】:

    【解决方案3】:
    image_files = ["1.jpg", "3.jpg", "2.jpg", "4.jpg", "6.jpg", "5.jpg", "20.jpg", "29.jpg", "11.jpg", "9.jpg"]
    
    image_files.sort(key=lambda item: (len(item), item))
    
    print(image_files)
    

    试试这个。

    【讨论】:

    • 你的回答很准确。谢谢。
    【解决方案4】:

    这可以通过多种方式完成。但是我制作的代码我尝试使其尽可能详尽和概念化我尝试将每个部分分解为许多子部分,这些子部分可以轻松完成,但为了更难理解查看器,我将代码分成 3 个部分,第一部分包含所有num 值,然后第二部分按 asc 顺序对其进行排序,然后第三部分带来整个文件并创建一个新列表。我还添加了一个可以接受重复值而没有任何错误的功能我还在 image_list 中添加了新项目以提高对查看器的理解。

        image_files = ["1.jpg", "3.jpg", "2.jpg", "4.jpg", "6.jpg", "5.jpg", "20.jpg", "29.jpg", "11.jpg", "9.jpg","5.img","6.img","100.png","20.jpg"]
        name_of_folder_list = [] #list of ints in the fine name
        for i in image_files:
            num = i.split('.')[0]
            name_of_folder_list.append(int(num))
        asc_name_of_folder_list = sorted(name_of_folder_list, reverse=False)#sorting the number list in ascending order
        output_list = []
        for i in asc_name_of_folder_list:
            for j in image_files:
                if int(j.split('.')[0]) == int(i):
                    output_list.append(j)#this will add the item to new list
                    image_files.remove(j)#this will remove from old list avoiding double values of duplicates
    
                else:
                    pass
    
    print(output_list)
    

    输出是:

    ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '5.img', '6.jpg', '6.img', '9.jpg', '11.jpg', '20.jpg', '20.jpg', '29.jpg', '100.png']
    
    Process finished with exit code 0
    

    这适用于任何格式,初学者也很容易理解。

    希望对你有帮助

    【讨论】:

    • 处理重复...太棒了!
    【解决方案5】:

    使用list.sort()方法解决这个问题

    image_files = ["1.jpg", "3.jpg", "2.jpg", "4.jpg", "6.jpg", "5.jpg", "20.jpg", "29.jpg", "11.jpg", "9.jpg"]
    image_files.sort(key=lambda x : int(x.split('.')[0]))
    print(image_files)
    #['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '9.jpg', '11.jpg', '20.jpg', '29.jpg']
    

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 2010-09-07
      • 2023-04-08
      • 2020-06-22
      相关资源
      最近更新 更多