【问题标题】:Alphanumerically sort a nested list of mixed data types in Python在 Python 中按字母数字对混合数据类型的嵌套列表进行排序
【发布时间】:2016-08-18 03:12:32
【问题描述】:

假设我有以下嵌套列表:

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'  ]]

如果按 column2 排序,则结构如下:

 nestedlist = [[ 'ABC' ,  1.5   ,  2  ,  '8W'  ],
               [ 'DEF' ,   2    , 0.2 ,  '2Z'  ],
               [   2   , 'EXT'  , 5.8 ,  '2W'  ]]

如果按 column3 排序,结构将如下所示:

 nestedlist = [[ 'DEF' ,   2    , 0.2 ,  '2Z'  ],
               [ 'ABC' ,  1.5   ,  2  ,  '8W'  ],
               [   2   , 'EXT'  , 5.8 ,  '2W'  ]]

最后,如果按 column4 排序,结构将是:

 nestedlist = [[   2   , 'EXT'  , 5.8 ,  '2W'  ],
               [ 'DEF' ,   2    , 0.2 ,  '2Z'  ],
               [ 'ABC' ,  1.5   ,  2  ,  '8W'  ]]

我知道,如果列中的所有项目都属于同一类型,则可以使用 sorted(nestedlist, key=itemgetter(sortColIndex)) 函数,但我终生无法弄清楚如何获取这可以使用混合类型。

【问题讨论】:

  • 虽然相似之处在于两者都涉及自然顺序排序,但它们的不同之处在于我的问题是关于自然排序混合数据类型的嵌套列表,而您提供的链接讨论了自然排序单个字符串列表的解决方案.
  • 您是否研究过按特定列对嵌套列表进行排序?这是一个相当常见的任务。除了上述关于自然排序的评论之外,请参阅 herehereherehere
  • 将所有内容转换为字符串,然后转换为数字的元素(如果您的字符串包含数字并且它们应该保留为字符串,则不适用)。或者,使用可以处理所有适用类型的比较/键功能。无论是嵌套列表还是普通列表都无关紧要,问题在于排序,而不是处理嵌套列表(这些问题也被问到了)。
  • TigerhawkT3 ... 感谢您提供 4 个帖子的链接,这些帖子没有解决我关于如何对混合数据类型的嵌套列表进行排序的问题。回答你关于我是否已经研究过如何自己完成这个问题的问题然后当我再次使用它时必须输入检查并转换回每个数据项。

标签: python sorting nested-lists


【解决方案1】:

用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])。此解决方案在比较之前将任何非字符串转换为字符串。

【讨论】:

    【解决方案2】:

    感谢大家提供的 cmets 和解决方案。 搜索您提供的几个链接以及其中的后续链接将我带到http://productarchitect.com/code/better-natural-sort.py,它解决了我遇到的所有边缘情况。再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多