【问题标题】:Sorting Nested List with Object List使用对象列表对嵌套列表进行排序
【发布时间】:2012-02-06 17:52:55
【问题描述】:

您好,我想弄清楚如何按多个变量对嵌套列表进行排序,而有些变量不会按 1、2、3 排序,而是按预定列表排序。

例如:

List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]]

这将导致:

[[XD,1],[XD,2],[XD,3],[XT,2],[X5,2],[X5,3]]

第一个元素将按 sortbylist 排序,第二个元素仅按数字顺序排序。

SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'}

我目前一直在尝试使用代码:

List.sort(key=SortByList.__getitem__  x: x[0])
List=sorted(List,key=itemgetter(1))

但这似乎不起作用。有什么提示吗?

最简单的方法之一是:

Result=sorted(List, key=lambda x:(SortByList[x[0]],x[1]))

【问题讨论】:

    标签: python list sorting nested


    【解决方案1】:

    怎么样:

    In [2]: List=[['XD',1],['XD',3],['XD',2],['X5',2],['X5',3],['XT',2]]
    
    In [3]: SortByList={'XD': 'A', 'XT':'B', 'XQ': 'C','X5': 'D'}
    
    In [4]: sorted(List, key=lambda x:(SortByList[x[0]],x[1]))
    Out[4]: [['XD', 1], ['XD', 2], ['XD', 3], ['XT', 2], ['X5', 2], ['X5', 3]]
    

    如您的问题中所述,这使用二元素复合键。

    【讨论】:

    • 这在直接在 python 中运行时非常有效。但是,当您将其放在程序中时,它似乎不会对列表进行排序。有什么想法吗?
    • @Ophion:这段代码只是打印出结果;它不会将其分配回List。将其更改为 List = sorted(List, key=...) 或使用 List.sort(key=...)
    【解决方案2】:

    这里的问题是您试图使用对象的名称对对象进行排序以获得排序顺序,但是您的对象没有对其名称的任何引用。除了在locals()globals() 中搜索之外,无法从您的对象XD 中看出它被称为'XD'

    您最好的选择是将变量存储在字典中,而不是直接存储在作用域/命名空间中。所以改变你的代码:

    XD = MyObject(...)
    X5 = MyObject(...)
    XT = MyObject(...)
    List=[[XD,1],[XD,3],[XD,2],[X5,2],[X5,3],[XT,2]]
    

    到这里:

    XDict = {'XD': MyObject(...),
             'X5': MyObject(...),
             'XT': MyObject(...)}
    List = [[XDict['XD'],1],[XDict['XD'],3],[XDict['XD'],2],
            [XDict['X5'],2],[XDict['X5'],3],[XDict['XT'],2]]
    

    List 的内容将完全相同,但现在您可以将名称 'XD''X5''XT' 与对象相关联,因此在定义 SortList 时可以创建按名称列出的实际对象列表:

    SortByList=[XDict.get('XD'), XDict.get('XT'), XDict.get('XQ'), XDict.get('X5')]
    sorted(List, key=lambda k, i: (SortedByList.index(k), i))
    

    通过这种方式,即使某些变量未定义,您也可以创建 SortByList,例如本例中的 XQSortByList 中的那个条目将只是 None,这在对其他元素进行排序时不会导致任何问题。

    【讨论】:

    • 我希望有一个更简单的答案。如果 aix 的建议不起作用,我将使用它。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多