排序(list,key=itemgetter)在Python中未正确排序项目列表

排序(list,key=itemgetter)在Python中未正确排序项目列表,python,list,sorting,Python,List,Sorting,我不明白为什么 ['1.11.-1', '2.0.0', '1.2.-1', '2.-1.-1', '0.1.-1', '1.2.1', '1.1.1', '2.0.-1'] ['0.1.-1', '1.11.-1', '1.1.1', '1.2.-1', '1.2.1', '2.-1.-1', '2.0.0', '2.0.-1'] ['0.1', '1.11', '1.1.1', '1.2', '1.2.1', '2', '2.0.0', '2.0'] 不将输出排序为 parse_list

我不明白为什么

['1.11.-1', '2.0.0', '1.2.-1', '2.-1.-1', '0.1.-1', '1.2.1', '1.1.1', '2.0.-1']
['0.1.-1', '1.11.-1', '1.1.1', '1.2.-1', '1.2.1', '2.-1.-1', '2.0.0', '2.0.-1']
['0.1', '1.11', '1.1.1', '1.2', '1.2.1', '2', '2.0.0', '2.0']

不将输出排序为

parse_list2 = sorted(parse_list, key=itemgetter(0, 1, 2))
因为2比11小


请有人帮我调整代码以使其正常工作(而不是给我一个不同的功能代码),或者向我解释为什么我的逻辑无法正常工作。

一些提示:

  • import
    s总是从一开始就导入(我删除了它,因为我不再使用它,而是将它们始终放在文件的顶部,通常是三个导入块,首先是标准库,第二是第三方库,第三是导入到程序的其他文件)
  • 第一级函数和类声明之间有2个空行
  • elif
    如果前面的条件为真,则不会尝试该条件,因此我们避免了不必要的条件检查
  • parse\u list
    将存储三个整数的元组,例如
    (1,11,-1)
  • parse\u list=sorted(parse\u list)
    相当于
    parse\u list.sort()
    ,后者执行此操作
  • unpasse
    函数将返回每个值,而不是附加到属于
    solution
    函数而不是
    unpasse
    函数的
    final_solution
    列表
def溶液(数据):
parse_list=[]
对于数据中的x:
y=x.split('.'))
如果len(y)==1:
parse_list.append((int(y[0]),-1,-1))
elif len(y)==2:
parse_list.append((int(y[0]),int(y[1]),-1))
elif len(y)==3:
parse_list.append((int(y[0]),int(y[1]),int(y[2]))
打印(解析列表)
parse_list.sort()
打印(解析列表)
def未解析(x):
如果x[1]<0:
返回“{}”。格式(x[0])
如果x[2]<0:
返回'{}.{}'。格式(x[0],x[1])
返回'{}.{}.{}'。格式(x[0],x[1],x[2])
最终解决方案=[]
对于parse_列表中的x:
最终解决方案。追加(未解析(x))
打印(最终解决方案)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
列表1=[“1.11”、“2.0.0”、“1.2”、“2”、“0.1”、“1.2.1”、“1.1.1”、“2.0”]
解决方案(列表1)
这也可以优化:

def溶液(数据):
parse_list=sorted([数据中项的元组(map(int,item.split('.')))))
最终的_解决方案=['.'。为parse_列表中的项连接(映射(str,item))
打印(最终解决方案)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
列表1=[“1.11”、“2.0.0”、“1.2”、“2”、“0.1”、“1.2.1”、“1.1.1”、“2.0”]
解决方案(列表1)
让我们将此解决方案分解为:

  • [doSomethingWith(item)for item in data]
    创建一个列表,其中每个元素都是
    doSomethingWith(item)
    的元素,每次使用
    数据的一个元素
  • doSomethingWith(item)
    在我们的例子中是
    tuple(map(int,item.split('.'))
  • 例如是
    “1.11”
  • item.split('.')
    为我们提供了字符串列表:
    [“1”,“11”]

  • map(f,iterable)
    将函数
    f
    应用于iterable的每个元素,并返回一个类似列表的对象(它不完全是列表,而是类似的)。在我们的例子中,
    f
    int
    ,因此我们将子字符串转换为整数:
    [1,11]
    您的值没有排序,因为它们是比较字符串,而不是整数

    以下是我将如何对它们进行排序:

    ['1.11.-1', '2.0.0', '1.2.-1', '2.-1.-1', '0.1.-1', '1.2.1', '1.1.1', '2.0.-1']
    ['0.1.-1', '1.1.1', '1.2.-1', '1.2.1', '1.11.-1', '2.-1.-1', '2.0.0', '2.0.-1']
    ['0.1', '1.1.1', '1.2', '1.2.1', '1.11', '2', '2.0.0', '2.0']
    

    “11”<“2”
    ,因为
    “1”<“2”
    。如果你想比较数字,你必须将它们转换成整数或浮点数,以便正确排序。欢迎使用SO!字符串按字典顺序排列。将它们解析为int。这里的目标是简单地对这些具有负数的版本字符串进行排序吗?问题描述是什么?当然有更好的方法来解决这个问题,不管它是什么…您所做的只是对每个字符串的前3个字符进行排序。它不试图解释多字符字段。所以对于
    '1.11.-1'
    ,它使用
    ('1','1','1')
    作为排序键。有人能给我一个指针把它们转换成整数吗?我试过了,但遇到了这样的问题:它不喜欢我尝试将列表更改为整数类型。
    itemgetter(0,1,2)
    获取字符串中的第一、第二和第三个字符,而不是数字。为什么不将它们存储为int
    (int(y[0])、int(y[1])、int(y[2]))
    的元组,然后对它们进行排序(不需要特殊的键参数)?很好的方法!不过,作者要求不要提供不同的解决方案。
    ['1.11.-1', '2.0.0', '1.2.-1', '2.-1.-1', '0.1.-1', '1.2.1', '1.1.1', '2.0.-1']
    ['0.1.-1', '1.1.1', '1.2.-1', '1.2.1', '1.11.-1', '2.-1.-1', '2.0.0', '2.0.-1']
    ['0.1', '1.1.1', '1.2', '1.2.1', '1.11', '2', '2.0.0', '2.0']
    
    def toIntList(x):
        intList = []
        for value in x.split("."):
            intList.append(int(value))
        return intList
    
    list1 = ["1.11", "2.0.0", "1.2", "2", "0.1", "1.2.1", "1.1.1", "2.0"]
    
    # Using a function
    sort1 = sorted(list1, key=toIntList)
    
    # Using a lambda-function:
    sort2 = sorted(list1, key=lambda x: [int(i) for i in x.split(".")])
    
    print(list1) # Output: ['1.11', '2.0.0', '1.2', '2', '0.1', '1.2.1', '1.1.1', '2.0']
    print(sort1) # Output: ['0.1', '1.1.1', '1.2', '1.2.1', '1.11', '2', '2.0', '2.0.0']
    print(sort2) # Output: ['0.1', '1.1.1', '1.2', '1.2.1', '1.11', '2', '2.0', '2.0.0']