在Python

时间:2016-04-24 20:26:17

标签: python sorting nested-lists

假设我有以下嵌套列表:

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

为了解释我的问题,我将内部列表称为行(即nestedlist [0] = row1,nestedlist [1] = row2等等),并将内部列表中的项目统称为与列共享相同的序数索引(即nested列[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'  ]]

我知道如果列中的所有项目都与排序的(嵌套列表,key = itemgetter(sortColIndex))函数相同,那么我可以使用但是我不能在生活中找出如何获取这可以使用混合类型。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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