gpt4 book ai didi

python - 在 Python 3 中使用不同类型按键对字典列表进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 02:23:04 25 4
gpt4 key购买 nike

我有一个方法可以通过一个键对字典列表进行分组。为此,我找到了 here我必须使用 groupby功能,但在我必须对列表进行排序之前。这是我现在的方法:

def group_list_by_key(data, key):
data.sort(key=lambda x: x[key])
result = []
for k, v in groupby(data, key=lambda x: x[key]):
result.append(list(v))
return result

只有在所有字典中定义了每个键并且值都是相同类型的情况下,这段代码才有效。但是,在我使用这种方法的地方,我不知道是否到处都定义了键,它们是否属于同一类型。在 Python 2.x 上我知道存在 sorted 函数 cmp可以进行自定义排序但来自 Python 3.x 的参数这已经不可能了。有没有办法进行自定义排序?我正在考虑使用 < 的经典排序并按类型名称排序。

到现在为止,我考虑过使用 get 函数并转换为类似这样的字符串

data.sort(key=lambda x: str(x.get(key)))
...
for k, v in groupby(data, key=lambda x: x.get(key)):

它只克服了字符串、数字和无内容的情况,但不是通用对象,如果我执行,它很容易崩溃

a = [{'b': 0, 'c': 1}, {'b': '0'}, {'b': 0, 'c': 2}, {'b': 1}, {'c': 3}]
group_list_by_key(a, 'b')

输出是

[[{'b': 0, 'c': 1}], [{'b': '0'}], [{'b': 0, 'c': 2}], [{'b': 1}], [{'c': 3}]]

而不是我期望的(列表的顺序不是问题)

[[{'b': 0, 'c': 1}, {'b': 0, 'c': 2}], [{'b': '0'}], [{'b': 1}], [{'c': 3}]]

最佳答案

你可以通过这样做来解决你的问题

data = [{'b': 0, 'c': 1}, {'b': '0'}, {'b': 0, 'c': 2}, {'b': 1}, {'c': 3}]
key='b'

def f(x):
ret = x.get(key, -1)
return ret if type(ret) == int else -2

result = [list(v) for k, v in groupby(sorted(data, key=f), f)]

# result: [[{'b': '0'}], [{'c': 3}], [{'b': 0, 'c': 1}, {'b': 0, 'c': 2}], [{'b': 1}]]

但如果您仍然需要自定义比较功能,您可以使用 functools.cmp_to_key 来实现

import functools
sorted(x, key=functools.cmp_to_key(custom_cmp_function))

关于python - 在 Python 3 中使用不同类型按键对字典列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51125432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com