Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据字符串列表中的数字对其进行排序?_Python_Python 3.x_List_Sorting_Sortedlist - Fatal编程技术网

Python 如何根据字符串列表中的数字对其进行排序?

Python 如何根据字符串列表中的数字对其进行排序?,python,python-3.x,list,sorting,sortedlist,Python,Python 3.x,List,Sorting,Sortedlist,我的问题真的很奇怪。我必须对列表进行排序,如下所示: list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"] 我想要的结果是: list1=["S01E01","S02E02", "S02E03", "S02E010", "S02E013"] 我使用了sort()。 如果在python控制台中键入“010”>“02”,它将返回false 请建议我调试此问题的任何方法。 试试这个: list1=["S01E01","S02E010",

我的问题真的很奇怪。我必须对列表进行排序,如下所示:

list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]
我想要的结果是:

list1=["S01E01","S02E02", "S02E03", "S02E010", "S02E013"]
我使用了
sort()。
如果在python控制台中键入“010”>“02”,它将返回false

请建议我调试此问题的任何方法。

试试这个:

list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]
list1.sort(key = lambda x: int(x[1:3] + x[4:]))
o/p:

试试这个:

list1=["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]
list1.sort(key = lambda x: int(x[1:3] + x[4:]))
o/p:


要做到这一点,您需要使用一个键函数,该函数将字符串拆分为多个组件,并将它们作为元组返回。如果您希望以数字形式考虑其值,则任何数字子字符串都应转换为整数,否则它将按字母顺序排列

根据样本数据,我认为这样做会是这样的:

def keyfunc(s):
    return s[0], int(s[1:3]), s[3], int(s[4:])

list1 = ["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]

result = sorted(list1, key=keyfunc)
print(result)  # -> ['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']

要做到这一点,您需要使用一个键函数,该函数将字符串拆分为多个组件,并将它们作为元组返回。如果您希望以数字形式考虑其值,则任何数字子字符串都应转换为整数,否则它将按字母顺序排列

根据样本数据,我认为这样做会是这样的:

def keyfunc(s):
    return s[0], int(s[1:3]), s[3], int(s[4:])

list1 = ["S01E01","S02E010", "S02E013", "S02E02", "S02E03"]

result = sorted(list1, key=keyfunc)
print(result)  # -> ['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']
重新导入
def键(op):
返回列表(映射(int,re.match('S(\d+)E(\d+),op.groups())
列表1=已排序(列表1,键=键)
重新导入
def键(op):
返回列表(映射(int,re.match('S(\d+)E(\d+),op.groups())
列表1=已排序(列表1,键=键)

您可以使用正则表达式从字符串中提取数字并将其放入元组中,因为在对数字进行排序时,元组是根据升序索引中的值进行排序的(按第一个值排序,而不是按第二个值排序,依此类推):

输出:

['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']

您可以使用正则表达式从字符串中提取数字并将其放入元组中,因为在对数字进行排序时,元组是根据升序索引中的值进行排序的(按第一个值排序,而不是按第二个值排序,依此类推):

输出:

['S01E01', 'S02E02', 'S02E03', 'S02E010', 'S02E013']

听起来你想要自然排序-应该回答你的问题吗?听起来你想要自然排序-应该回答你的问题吗?如果一个系列有100多个季节,那就不对了?但同时拥有100个季节是不现实的。@Ch3steR:我实现了基于示例字符串的拆分,但并没有对“字段”的含义或数字字段的范围进行描述。根据模式的实际情况,拆分可能会变得更复杂,可能需要类似正则表达式的东西来解析-但基本思想保持不变。是的,我不是说答案不好。但是OP应该提到数据上的限制,比如没有超过20个季节的系列。在我看来,只有了解相关数据和约束条件,我们才能提供更优化、更高效的解决方案。有时通用的解决方案效率较低,但它确实给出了如何做事情的想法+1.如果一个系列剧有超过100个赛季,那就不对了?但同时拥有100个季节是不现实的。@Ch3steR:我实现了基于示例字符串的拆分,但并没有对“字段”的含义或数字字段的范围进行描述。根据模式的实际情况,拆分可能会变得更复杂,可能需要类似正则表达式的东西来解析-但基本思想保持不变。是的,我不是说答案不好。但是OP应该提到数据上的限制,比如没有超过20个季节的系列。在我看来,只有了解相关数据和约束条件,我们才能提供更优化、更高效的解决方案。有时通用的解决方案效率较低,但它确实给出了如何做事情的想法+1.如果列表1有
“S01E20”
,您的代码会给出错误的输出。OP希望根据季节和情节进行排序。顺便说一句,我没有投反对票。@Ch3steR谢谢你的纠正。我也根据季节更新了代码:)如果列表1有
'S01E20'
,您的代码会给出错误的输出。OP希望根据季节和情节进行排序。顺便说一句,我没有投反对票。@Ch3steR谢谢你的纠正。我也根据季节更新了代码:)