我有一个 python 中的对象列表,以及一个比较函数,给定两个对象,该函数决定它们是否应该被视为相等。
我想将对象列表转换为新的列表列表,其中每个子列表收集比较相等的元素。
执行此操作的 Python 方法是什么?
最佳答案
拥有一个 compare
函数,根据元素是否相等返回 True
或 False
并不理想。基本上,您必须将每个元素与每个现有组中的某些“原型(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/