Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Python 如何按语法和数字顺序对带有数字的字符串列表进行排序?

Python 如何按语法和数字顺序对带有数字的字符串列表进行排序?,python,sorting,Python,Sorting,现在我有一个数字字符串列表,字符串是泰语,如下所示 mylist = ['เชียงใหม่_10_เขต', 'เชียงใหม่_1_เขต', 'เชียงใหม่_2_เขต', 'พะเยา', 'ภูเก็ต', 'กรุงเทพ'] 当我用这个代码按语法键对列表排序时 import pyuca sort_key = sorted(mylist, key=pyuca.Collator().sort_key) 字符已正确排序,但具有相同字符但不同数字的字符串未按数字排序,如下面的输

现在我有一个数字字符串列表,字符串是泰语,如下所示

mylist = ['เชียงใหม่_10_เขต', 'เชียงใหม่_1_เขต', 'เชียงใหม่_2_เขต', 'พะเยา', 'ภูเก็ต', 'กรุงเทพ']
当我用这个代码按语法键对列表排序时

import pyuca
sort_key = sorted(mylist, key=pyuca.Collator().sort_key)
字符已正确排序,但具有相同字符但不同数字的字符串未按数字排序,如下面的输出

['กรุงเทพ', 'เชียงใหม่_1_เขต', 'เชียงใหม่_10_เขต', 'เชียงใหม่_2_เขต', 'พะเยา', 'ภูเก็ต']
我想要的输出是这样的

['กรุงเทพ', 'เชียงใหม่_1_เขต', 'เชียงใหม่_2_เขต', 'เชียงใหม่_10_เขต', 'พะเยา', 'ภูเก็ต']

那么有什么方法可以做到这一点。

您需要从字符串末尾提取数字并将其转换为
int
,否则排序将是字典式的。您可以使用正则表达式分别提取字母和小数部分,并使用提取的
(单词、数字)
对元组进行排序:

import pyuca
import re

def sorter(s, c):
    dig = 0
    l = re.split('(\d+)', s)
    alpha = []
    for i in l:
        try:
            dig = int(i)
        except ValueError:
            alpha.append(i)
    return c.sort_key(''.join(alpha)), dig
现在,如果我们使用上述转换函数进行排序:

c = pyuca.Collator()
sorted(mylist, key=lambda s: sorter(s, c))

['กรุงเทพ',
 'เชียงใหม่_1_เขต',
 'เชียงใหม่_2_เขต',
 'เชียงใหม่_10_เขต',
 'พะเยา',
 'ภูเก็ต']

这回答了你的问题吗@tevemadar感谢您的回复,我已尝试使用此代码
natsorted(sort_key)
,字符串编号已正确排序,但它更改了语法顺序并使其出错,这是输出
['กรุงเทพ', 'พะเยา', 'ภูเก็ต', 'เชียงใหม่เขต1', 'เชียงใหม่เขต2', 'เชียงใหม่เขต10']
你能用同样的问题创建一个英语示例,以便更容易地帮助你吗?据我所知,
natsorted
sorted
的替代品。尝试排序(mylist,key=pyuca.Collator().sort\u key)@tevemadar我已经尝试过了,但是按数字排序仍然是错误的,这就是结果กรุงเทพ', 'เชียงใหม่เขต1', 'เชียงใหม่เขต10', 'เชียงใหม่เขต2', 'พะเยา', 'ภูเก็ต']非常感谢,这非常有帮助,但是如果数字不总是在单词的末尾,如
เชียงใหม่_1_เขต
,有什么方法可以做到这一点吗?你能给出一些在这种情况下你期望的行为的例子吗?Shhould
_เขต
也要说明订购的内容?@kaowfer示例我有此列表
['เชียงใหม่_10_เขต', 'เชียงใหม่_1_เขต', 'เชียงใหม่_2_เขต', 'พะเยา', 'ภูเก็ต', 'กรุงเทพ']我想像这样对它进行排序กรุงเทพ', 'เชียงใหม่_1_เขต', 'เชียงใหม่_2_เขต', 'เชียงใหม่_10_เขต', 'พะเยา', 'ภูเก็ต']我想要的是,如果单词中的其他字符是相同的,但它有不同的数字(在该单词的任何地方),那么它应该按照数字进行查找和排序。更新,现在应该可以了@Kaow你也可以更新这个问题吗?谢谢,这对我帮助很大:D