【问题标题】:How to sort a list of dictionaries by the value of a key and by the value of a value of a key?如何按键的值和键的值对字典列表进行排序?
【发布时间】:2016-10-06 21:30:38
【问题描述】:
{
    "states": [
        {
            "timestamp": {
                "double": 968628281.0
            },
            "sensorSerialNumber": 13020235
        },
        {
            "timestamp": {
                "double": 964069109.0
            },
            "sensorSerialNumber": 13020203
        },
        {
            "timestamp": {
                "double": 9641066.0
            },
            "sensorSerialNumber": 30785
        }
    ]
}

有没有办法按“sensorSerialNumber”和“timestamp”(9.68628281E8)的值内的这个数字对这个字典列表进行排序,

"timestamp":{"double":9.68628281E8}

使用内置函数(排序)

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name'))

但是,我的问题与其他问题略有不同。如果字典中没有字典,我只需将第二个键的字符串添加到内置函数中,例如:

from operator import itemgetter
newlist = sorted(list_to_be_sorted, key=itemgetter('name', 'age'))

【问题讨论】:

  • sorted(clean_sensors_data["states"], key= lambda user: (user["sensorSerialNumber"], user["timestamp"]["double"])) 这个解决方案

标签: python list sorting dictionary


【解决方案1】:

key 可以是任何可调用的,它会依次传递list_to_be_sorted 中的每个元素。所以lambda 适合这里:

newlist = sorted(
    data['states'],
    key=lambda i: (i['sensorSerialNumber'], i['timestamp']['double']))

因此,lambda 返回 'sensorSerialNumber' 键的值作为元组的第一个元素,并从 'timestamp' 键的字典值中返回 'double' 键的值。

演示:

>>> data = {"states" :
... [{"timestamp":{"double":9.68628281E8},"sensorSerialNumber":13020235},
... {"timestamp":{"double":9.64069109E8},"sensorSerialNumber":13020203},
... {"timestamp":{"double":9641066.0},"sensorSerialNumber":30785}]
... }
>>> sorted(data['states'], key=lambda i: (i['sensorSerialNumber'], i['timestamp']['double']))
[{'timestamp': {'double': 9641066.0}, 'sensorSerialNumber': 30785}, {'timestamp': {'double': 964069109.0}, 'sensorSerialNumber': 13020203}, {'timestamp': {'double': 968628281.0}, 'sensorSerialNumber': 13020235}]
>>> from pprint import pprint
>>> pprint(_)
[{'sensorSerialNumber': 30785, 'timestamp': {'double': 9641066.0}},
 {'sensorSerialNumber': 13020203, 'timestamp': {'double': 964069109.0}},
 {'sensorSerialNumber': 13020235, 'timestamp': {'double': 968628281.0}}]

演示没有那么有意义,因为没有相等的序列号可以包含时间戳值来产生影响。

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多