排序(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小
请有人帮我调整代码以使其正常工作(而不是给我一个不同的功能代码),或者向我解释为什么我的逻辑无法正常工作。一些提示:
s总是从一开始就导入(我删除了它,因为我不再使用它,而是将它们始终放在文件的顶部,通常是三个导入块,首先是标准库,第二是第三方库,第三是导入到程序的其他文件)import
- 第一级函数和类声明之间有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']