如何在python中对以数字开头的字符串进行排序?

如何在python中对以数字开头的字符串进行排序?,python,python-3.x,sorting,tkinter,Python,Python 3.x,Sorting,Tkinter,我必须对列表进行排序以显示在下拉列表(tkinter)中,但列表以数字开头 tkvar = StringVar(window) choices = {"1 - Potatos", "2- Tomatos", etc} 当我使用sort时,我得到: 1 - Potatos 10 - Something 11 - Something else 2 - Tomatos 如果我拆分为数字字符串对,如: choices = {(1," - Potatos"), (2,"- Tomatos"), etc

我必须对列表进行排序以显示在下拉列表(tkinter)中,但列表以数字开头

tkvar = StringVar(window)
choices = {"1 - Potatos", "2- Tomatos", etc}
当我使用
sort
时,我得到:

1 - Potatos
10 - Something
11 - Something else
2 - Tomatos
如果我拆分为数字字符串对,如:

choices = {(1," - Potatos"), (2,"- Tomatos"), etc}
在下拉列表中显示如下:

1{ - Potatos}
2{ - Tomatos}
...
显然,我不想打印
{}

我想要下拉列表,如下所示:

1 - Potatos
2 - Tomatos

tkvar.set('1 - Potatos')

popupMenu = OptionMenu(topFrame, tkvar, *choices)

tkvar.trace('w', change_dropdown)

def change_dropdown(*args):
    print( tkvar.get() )
...

有没有一种简单的方法可以做到这一点?

使用带有
键的
排序的

l = [
    "1 - Potatos",
    "10 - Something",
    "11 - Something else",
    "2 - Tomatos"
]

for s in sorted(l, key=lambda x: int(x.split("-")[0])):
    print(s)
输出:

1 - Potatos
2 - Tomatos
10 - Something
11 - Something else

排序
参数一起使用:

l = [
    "1 - Potatos",
    "10 - Something",
    "11 - Something else",
    "2 - Tomatos"
]

for s in sorted(l, key=lambda x: int(x.split("-")[0])):
    print(s)
输出:

1 - Potatos
2 - Tomatos
10 - Something
11 - Something else
考虑使用图书馆。这是一个很小的图书馆,做了很多建议,但非常详细。它将字符串的数字部分和非数字部分分开,以便按自然顺序对它们进行排序(因此得名)

最简单的方法是:

from natsort import natsorted

choices = natsorted(choices)
这不是就地排序。为此,您可以生成自己的排序键并将其传递给
列表。排序

from natsort import natsort_keygen

choices.sort(key=natsort_keygen())
我与natsort没有任何关系,只是一个满意的用户。

考虑使用该库。这是一个很小的图书馆,做了很多建议,但非常详细。它将字符串的数字部分和非数字部分分开,以便按自然顺序对它们进行排序(因此得名)

最简单的方法是:

from natsort import natsorted

choices = natsorted(choices)
这不是就地排序。为此,您可以生成自己的排序键并将其传递给
列表。排序

from natsort import natsort_keygen

choices.sort(key=natsort_keygen())

我与natsort没有任何关系,只是一个满意的用户。

找到了一个超级简单的解决方案。
我在做:

list={"1-a",
      "2-b",
      "3-c"}
这个可以按任何顺序打印

只需将{}更改为[]

list=["1-a",
      "2-b",
      "3-c"]

而且效果很好。这将打印阵列的精确顺序。

找到了一个超级简单的解决方案。
我在做:

list={"1-a",
      "2-b",
      "3-c"}
这个可以按任何顺序打印

只需将{}更改为[]

list=["1-a",
      "2-b",
      "3-c"]

而且效果很好。这将打印数组的确切顺序。

第一个示例是
集合。你不能直接分类。您能展示一下您的实际数据结构和代码吗?您提到了下拉列表,但示例中没有显示如何填充它们。请将其添加到中。第一个示例是
集合
。你不能直接分类。您能展示一下您的实际数据结构和代码吗?您提到了下拉列表,但示例中没有显示如何填充它们。请将其添加到.Errors:File“XXXXXXX.py”第146行中,用于排序中的s(选项,key=lambda x:int(x.split(“-”[0]):文件“XXXXXXX.py”,第146行,用于排序中的s(选项,key=lambda x:int(x.split(“-”[0]):值错误:无效的int()以10为基数:“无”@AJSilva您的
选择有问题。检查itOMG,找到解决方案…不需要排序或任何东西,只需使用[]而不是{}
{“1-potato”,“2-potato”}
是python
set
,而
[…]
列表。在继续您的程序之前,请确保熟悉它们,您不会对以下错误感到遗憾:文件“XXXXXXX.py”,第146行,在for s in sorted(选项,key=lambda x:int(x.split(“-”[0]):文件“XXXXXXX.py”,第146行,在for s in sorted(选项,key=lambda x:int(x.split(“-”[0]):value错误:无效的文本for int()以10为基数:“无”@AJSilva您的
选择有问题。检查itOMG,找到解决方案…不需要排序或任何东西,只需使用[]而不是{}
{“1-potato”,“2-potato”}
是python
set
,而
[…]
列表。在继续你的课程之前,一定要熟悉它们,你不会后悔的