python - 比较三个(或更多)词典并在至少两个词典相等的情况下找到匹配项

标签 python algorithm design-patterns

我遇到了类似于 this one 的问题.但是,该 SO 问题严格关注三个变量。我正在寻找一种适用于三个以上的解决方案。

这是我的两个变量的代码:

for track_a in collection_a:
    for track_b in collection_b:

        t1 = track_a["tempo"]
        t2 = track_b["tempo"]
        k1 = track_a["key"]
        k2 = track_b["key"]
        m1 = track_a["mode"]
        m2 = track_b["mode"]

        if (t1 == t2) and (k1 == k2) and (m1 == m2):
            collection_c.append((track_a, track_b))

这是我对三个变量的解决方案:

for track_a in collection_a:
    for track_b in collection_b:
        for track_c in collection_c:

            t1 = track_a["tempo"]
            t2 = track_b["tempo"]
            t3 = track_c["tempo"]
            k1 = track_a["key"]
            k2 = track_b["key"]
            k3 = track_c["key"]
            m1 = track_a["mode"]
            m2 = track_b["mode"]
            m3 = track_c["mode"]

            a = (t1 == t2) and (k1 == k2) and (m1 == m2)
            b = (t2 == t3) and (k2 == k3) and (m2 == m3)
            c = (t3 == t1) and (k3 == k1) and (m3 == m1)

            if a: collection_c.append((track_a, track_b))
            if b: collection_c.append((track_b, track_c))
            if c: collection_c.append((track_c, track_a))

显然,此解决方案不可扩展且速度慢。考虑到我必须检查所有这些,我怀疑它是否会很快,因为我们必须遍历所有可能的组合,但我至少可以让它扩展吗? (最多至少 5 个)。此外,如果可能,允许稍后添加更多比较特征。

最佳答案

在线性时间内解决问题的一种有效方法是将字典转换为卡住的键值元组集(通过用于相等性测试的键),以便它们可以散列并用作字典键(签名)自己,这样你就可以简单地使用集合字典来对它们进行分组:

groups = {}
for track in collections: # collections is a combination of all the collections you have
    groups.setdefault(frozenset((k, track[k]) for k in ('tempo', 'key', 'mode')), set()).add(track['name'])

这样:

[group for group in groups.values() if len(group) >= 3]

将为您返回签名相同的 3 首轨道的名称集列表。

关于python - 比较三个(或更多)词典并在至少两个词典相等的情况下找到匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54637962/

相关文章:

oop - 派生类中的额外公共(public)方法?

c# - 指定我需要一个实现 2 个或更多接口(interface)的对象的接口(interface)引用

c++ - 选择正确的子类以编程方式实例化

python - Pandas :计算时间戳和当前时间之间耗时,但仅限营业时间和时区

python - 如何通过另一个数据框中的键过滤数据框中的列

javascript - 不断增长的数组的内存高效下采样(图表)

java - 通过另一个数组对数组进行二进制搜索的最佳方法是什么?

python - 编辑 View 中的只读表单域 - Flask-Admin

python - 对于 pandas 数据框中的特定单元格,删除列表的元素

algorithm - 解决旅行推销员的复杂递归关系