gpt4 book ai didi

python - 将列表中的元素收集到相等元素列表的列表中?

转载 作者:行者123 更新时间:2023-11-28 22:41:36 25 4
gpt4 key购买 nike

我有一个 python 对象列表,以及一个比较函数,给定两个对象,决定它们是否应该被视为相等。

我想将对象列表转换为新的列表列表,其中每个子列表收集比较相等的元素。

执行此操作的 pythonic 方法是什么?

最佳答案

具有compare 函数,根据元素是否相等返回TrueFalse,这并不理想。基本上,您必须将每个元素与每个现有组中的某个“原型(prototype)”进行比较。像这样:

def group(elements, comp_func):
groups = {}
for x in elements:
for y in groups:
if comp_func(x, y):
groups[y].append(x)
break
else:
groups[x] = [x]
return groups

或者更短一点(但不会更快):

def group(elements, comp_func):
groups = {}
for x in elements:
prototype = next((y for y in groups if comp_func(x, y)), x)
groups.setdefault(prototype, []).append(x)
return groups

例子:

>>> def comp_len(o1, o2):
... return len(o1) == len(o2)
>>> group(["foo", "bar", "blub", "blah", "bonk"], comp_len)
{'foo': ['foo', 'bar'], 'blub': ['blub', 'blah', 'bonk']}

使用 key 函数,将每个元素映射到某个可哈希值会更好:

def group(elements, key_func):
groups = {}
for x in elements:
key = key_func(x)
if key in groups:
groups[key].append(x)
else:
groups[key] = [x]
return groups

例子:

>>> group(["foo", "bar", "blub", "blah", "bonk"], len)
{3: ['foo', 'bar'], 4: ['blub', 'blah', 'bonk']}

关于python - 将列表中的元素收集到相等元素列表的列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445615/

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