遍历嵌套有字典的多级列表的功能无法正常工作

时间:2019-05-09 18:59:26

标签: python

我想比较两个列表并验证它们是否相同。尽管列表中的项目顺序可能不同,所以仅比较list1 == list2是行不通的。 这些列表可以嵌套到字典,字符串,整数和列表的多级列表中,因此仅使用sorted(list1) == sorted(list2)也不起作用。

我试图创建一个遍历多级列表并按升序对其中的每个列表进行排序的函数。 到目前为止,我得到的结果仅对第一级main列表进行排序。所有其他“子列表”都在函数内部进行排序,但是当我打印最终结果时,在使用该函数之前,它们以相同的方式未排序。

到目前为止创建的功能:

def sort_multilevel_obj(items):    
    if isinstance(items, dict):
        for v in items.values():
            if isinstance(v, list):
                v = sorted(v)
            v = sort_multilevel_obj(v)
    if isinstance(items, list):
        items = sorted(items)
        for i in items:
            i = sort_multilevel_obj(i)

    return items

多级列表示例:

mylist = [
    'string1',
    [
        {
            1:'one',
            2:'two',
            3:[4,2,'ddd'],
            4:{'x':'xx'}
        },
        'substring'
    ],
    {
        'somekey':7,
        'anotherkey':[
            'ccccccc',
            100,
            4,
            'blabla'
        ]
    }
]

当我将列表传递给函数时,得到的结果是:

[{'z': ['ccccccc', 100, 4, 'afsafas'], 'f': 7}, [{1: 'one', 2: 'two', 3: [4, 2, 'ddd'], 4: {'x': 'xx'}}, 'substring'], 'string1']

拳头列表(字符串,列表,字典)已正确排序(以字典,列表,字符串),但字典(['ccccccc', 100, 4, 'afsafas'])中的列表应返回为[4, 100, 'afsafas', 'ccccccc'],但这只是不不行 我在做什么错了?

1 个答案:

答案 0 :(得分:0)

尝试使用v.sort()代替v = sorted(v)v.sort()更改了原始列表,而sorted(v)返回了一个新对象。有关v.sort()sorted(v)之间的区别的另一说明,请参见此answer

v = sorted(v)不会更改列表/字典本身中的值的原因是因为变量v基本上仅是对dict /列表中原始值的引用。使用v = <something>时,您将该变量指向另一个对象,因此不会更改原始值。