我遇到了类似于 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/