Python 如何根据数值顺序对包含组合数值和文本值的列表进行排序

Python 如何根据数值顺序对包含组合数值和文本值的列表进行排序,python,python-3.x,list,sorting,Python,Python 3.x,List,Sorting,我有一张未分类的名单 ['1 Apple', '6 Apple', '2 Apple', '4 Apple', '3 Apple', '170 Apple', 'category'] 如何创建一个以升序添加值的列表,以便: ['category', '1 Apple', '2 Apple', '3 Apple', '4 Apple', '6 Apple', '170 Apple']` 您可以使用sort或sorted指定从字符串中提取该数字的键 这是一个不处理所有角点情况(浮点、负数、无整数

我有一张未分类的名单

['1 Apple', '6 Apple', '2 Apple', '4 Apple', '3 Apple', '170 Apple', 'category']
如何创建一个以升序添加值的列表,以便:

['category', '1 Apple', '2 Apple', '3 Apple', '4 Apple', '6 Apple', '170 Apple']`

您可以使用sort或sorted指定从字符串中提取该数字的键

这是一个不处理所有角点情况(浮点、负数、无整数排序)的快速示例,但应该足以让您了解总体思路:

def数字键(字符串):
拆分=字符串。拆分(“”)
如果拆分[0]。isdigit():
返回整数(已拆分[0])
返回-1
我的列表。排序(键=数字键)

您可以使用sort或sorted指定从字符串中提取该数字的键

这是一个不处理所有角点情况(浮点、负数、无整数排序)的快速示例,但应该足以让您了解总体思路:

def数字键(字符串):
拆分=字符串。拆分(“”)
如果拆分[0]。isdigit():
返回整数(已拆分[0])
返回-1
我的列表。排序(键=数字键)

适用于任何类型的“仅混合字符串+数字字符串元素”列表的简单解决方案


简单的解决方案应该适用于任何类型的“仅混合字符串+数字字符串元素”列表

这可以通过以下方式完成:

s=sorted(s,key=lambda x:int(x.split(“”)[0]))

但仅当列表前面包含空格和数字值时,如您指定的情况。对于“类别”,我们可以很容易地区分它是否遵循上述逻辑。

这可以通过

s=sorted(s,key=lambda x:int(x.split(“”)[0]))

但仅当列表前面包含空格和数字值时,如您指定的情况。对于“类别”,我们可以很容易地区分它是否遵循上述逻辑。

以我的方式,在一行中(适用于所有混合类型):

我的方式,在一行中(适用于所有混合类型):


它能包含负数和/或浮点数吗?['1苹果'、'6苹果'、'2苹果'、'4苹果'、'3苹果'、'170苹果'、'类别'、'书籍']。在这种情况下,您想要的输出是什么?它可以包含负数和/或浮点数吗?['1 Apple','6 Apple','2 Apple','4 Apple','3 Apple','170 Apple','category','book']。在这种情况下,您想要的输出是什么?谢谢,伙计!我还尝试使用lambda函数来去除“apple”,它也可以使用。如果拆分,则
部分是不必要的,因为它将始终返回一个非空列表:即使无法拆分字符串,也将返回一个包含原始字符串的列表,以确保完全精确:只要指定了分隔符,我的最后一条注释都为true。在未明确指定空格的情况下拆分空格(等于传递
None
)时,拆分空字符串或仅拆分空格时可能会返回空列表。在这种情况下,它将永远不会是一个空的ListMate!我还尝试使用lambda函数来去除“apple”,它也可以使用。如果拆分,则
部分是不必要的,因为它将始终返回一个非空列表:即使无法拆分字符串,也将返回一个包含原始字符串的列表,以确保完全精确:只要指定了分隔符,我的最后一条注释都为true。在未明确指定空格的情况下拆分空格(等于传递
None
)时,拆分空字符串或仅拆分空格时可能会返回空列表。在这种情况下,它永远不会是一个空列表
import re
s = ['1Apple', '6 Apple', '2 Apple', '4 Apple', '3 Apple', '170 Apple', 'category']
nums = [re.findall('\d+',ss) for ss in s] # extracts numbers from strings
numsint = [int(*n) for n in nums] # returns 0 for the empty list corresponding to the word
sorted_list = [x for y, x in sorted(zip(numsint, s))] # sorts s based on the sorting of nums2

print(sorted_list)
# output
['category', '1Apple', '2 Apple', '3 Apple', '4 Apple', '6 Apple', '170 Apple']
import re
s=['1 Apple', '6 Apple', '2 Apple', '4 Apple', '3 Apple', '170 Apple', 'category', 'billy']

x=[i[2] for i in sorted([([float(i) for i in (re.findall(r'\d+',i))],re.findall(r'[^0-9]+',i),i) for i in s])]

['billy',
 'category',
 '1 Apple',
 '2 Apple',
 '3 Apple',
 '4 Apple',
 '6 Apple',
 '170 Apple']