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

标签 python

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

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

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

最佳答案

拥有一个 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/

相关文章:

python - 在 python 中生成重置 token 的最佳方法是什么?

python - 基于某些条件的字符串有效性

python - 如何通过 describe() 函数在 Python 中打印整个数字?

python - 从 Python 中的 url 读取 gzip csv 时出错 : "_csv.Error: line contains NULL byte"

python - 在创建 QCoreApplication 之前必须设置属性 Qt::AA_UseSoftwareOpenGL

javascript - 使用Python编写Javascript : look for indexOf new line

python - 在 bash、R、python 或 NCL 中将 hdf5 转换为 netcdf4?

python - 如何使用 abi 标签创建一个完整的轮子?

python - 未找到 eventlet.green.urllib2 模块

python - 使用 Python,如何按小时对 Dataframe 中的列进行分组?