【问题标题】:How can I order response based on dynamic key如何根据动态键订购响应
【发布时间】:2021-09-28 13:51:41
【问题描述】:

我有一个下面的数据响应,我想根据特定字段进行排序(字段应该是可配置的,以便稍后我们可以更改排序键,如 f_name、city、type... 来自 dict 的嵌套列表中的任何一个)

data = [{"type":"single",
    "ra":"SI-11", 
    "name":{
        "f_name":"Jon",
        "l_name":"Devi", 
        "prefix":"Mr"},
    "addresses":[{
        "address": "123St",
        "city": "New York",
        "state": "NY"
        },
        {
        "address": "14St",
        "city": "New York",
        "state": "NY"
        }],
        "racks": ["racks1", "rack2"],
    },
    {"type":"multiple",
    "ra":"SI-44", 
    "name":{
        "f_name":"Patrik",
        "l_name":"Dev", 
        "prefix":"Mr"},
    "addresses":[{
        "address": "333St",
        "city": "New York",
        "state": "NY"
        },
        {
        "address": "14000St",
        "city": "New York",
        "state": "NY"
        }],
        "racks": ["racks1", "rack2"],
    }]

提前致谢!

【问题讨论】:

  • sortsorted 与适当的键功能一起使用的惯用方式。 functools.cmp_to_key 是一个很好的工具,可以轻松编写比较多个元素的关键函数。

标签: python list sorting dictionary nested-lists


【解决方案1】:

我认为您应该定义自定义键功能,该功能将接受在嵌套结构中搜索的路径:

data = ...  # List[Dict]

def key_resolver(path):
    def function(x):
        value = x

        for key in path.split('.'):
            value = value.get(key, {})

        return value

    return function

# use case
sorted(data, key=key_resolver('name.f_name'))  # delimit nested keys using "." (dot)

【讨论】:

  • 嘿,感谢您的回复,但是它抛出了错误......对此有任何想法吗? TypeError:“NoneType”和“NoneType”的实例之间不支持“
  • 您能分享一下path 的值吗?我认为您传递的格式错误,或者密钥路径不存在
  • 路径值 - name.f_name
  • for key in path.split('.'): result = x.get(key) 这试图在第二次迭代结果中从 x 获取键(名称和 f_name)无
  • 对不起,我的错误,而不是结果,应该使用 value 作为返回变量名 - 修复了答案
猜你喜欢
  • 2021-05-23
  • 2022-11-07
  • 2023-03-20
  • 2011-03-12
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多