按字母数字顺序对 Python 中的混合数据类型的嵌套列表进行排序
Alphanumerically sort a nested list of mixed data types in Python
假设我有以下嵌套列表:
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
为了解释我的问题,我将内部列表称为行(即 nestedlist[0] = row1、nestedlist[1] = row2 等),并将内部列表中的项目统称为与列共享相同序号索引的列表(即 nestedlist[0][0] = column1 的 item1,nestedlist[1][0] = column1 的 item2,等等)
我将如何根据特定列中的值对行进行排序,这样如果对 column1 进行排序,结果结构将如下所示:
nestedlist = [[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'ABC' , 1.5 , 2 , '8W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
如果按第 2 列排序,结构将如下所示:
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 2 , 'EXT' , 5.8 , '2W' ]]
如果按第 3 列排序,结构将如下所示:
nestedlist = [[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ]]
最后,如果按第 4 列排序,结构将是:
nestedlist = [[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 'ABC' , 1.5 , 2 , '8W' ]]
我知道如果一列中的所有项目都属于同一类型,则可以使用 sorted(nestedlist, key=itemgetter(sortColIndex)) 函数,但我终生无法弄清楚如何使用混合类型使其工作。
用python进行自然排序不要脸复制粘贴:
#!/usr/bin/env python3
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
import re
def natural_key(string_):
"""See http://www.codinghorror.com/blog/archives/001018.html"""
return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]
sort_column = 0
print(sorted(nestedlist, key=lambda x: natural_key(str(x[sort_column]))))
如果您不关心自然排序,那就去做 key=lambda x: str(x[i])
。此解决方案在比较之前将任何非字符串转换为字符串。
感谢大家提供的意见和解决方案。
搜索您提供的几个链接以及其中的后续链接,我会找到 http://productarchitect.com/code/better-natural-sort.py,它解决了我遇到的所有边缘情况。再次感谢。
假设我有以下嵌套列表:
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
为了解释我的问题,我将内部列表称为行(即 nestedlist[0] = row1、nestedlist[1] = row2 等),并将内部列表中的项目统称为与列共享相同序号索引的列表(即 nestedlist[0][0] = column1 的 item1,nestedlist[1][0] = column1 的 item2,等等)
我将如何根据特定列中的值对行进行排序,这样如果对 column1 进行排序,结果结构将如下所示:
nestedlist = [[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'ABC' , 1.5 , 2 , '8W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
如果按第 2 列排序,结构将如下所示:
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 2 , 'EXT' , 5.8 , '2W' ]]
如果按第 3 列排序,结构将如下所示:
nestedlist = [[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ]]
最后,如果按第 4 列排序,结构将是:
nestedlist = [[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ],
[ 'ABC' , 1.5 , 2 , '8W' ]]
我知道如果一列中的所有项目都属于同一类型,则可以使用 sorted(nestedlist, key=itemgetter(sortColIndex)) 函数,但我终生无法弄清楚如何使用混合类型使其工作。
用python进行自然排序不要脸复制粘贴:
#!/usr/bin/env python3
nestedlist = [[ 'ABC' , 1.5 , 2 , '8W' ],
[ 2 , 'EXT' , 5.8 , '2W' ],
[ 'DEF' , 2 , 0.2 , '2Z' ]]
import re
def natural_key(string_):
"""See http://www.codinghorror.com/blog/archives/001018.html"""
return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]
sort_column = 0
print(sorted(nestedlist, key=lambda x: natural_key(str(x[sort_column]))))
如果您不关心自然排序,那就去做 key=lambda x: str(x[i])
。此解决方案在比较之前将任何非字符串转换为字符串。
感谢大家提供的意见和解决方案。 搜索您提供的几个链接以及其中的后续链接,我会找到 http://productarchitect.com/code/better-natural-sort.py,它解决了我遇到的所有边缘情况。再次感谢。