按字母数字顺序对 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,它解决了我遇到的所有边缘情况。再次感谢。