反向字典属性设置为ids?

Reverse dictionary attributes set to ids?

我有以下翻译词典:

{0: {'a', 'b', 'c'},
1: {'a', 'b', 'c', 'd'},
2: {'k', 'b', 'e', 'a', 'n'}}

而且我想 'reverse' 它成为键的属性(这里的键是 id 的一种形式)。 给定一组属性,给我相关的id(key)。

例如,给定 {'a', 'b', 'c'} return 0.

执行此操作的最佳做​​法是什么?属性可以以不同的顺序出现,这就是我使用集合的原因。 我应该将它插入数据框吗(翻译table)?或者有其他解决方案?

您可以使用 Seriespandas 中实现此目的:

import pandas as pd

x = {0: {'a', 'b', 'c'},
1: {'a', 'b', 'c', 'd'},
2: {'k', 'b', 'e', 'a', 'n'}}

lookup = pd.Series(x)
print(lookup[lookup.values == {'a', 'b', 'c'}])
# 0    {c, b, a}
# dtype: object

您可以遍历整个字典并像这样查找匹配项:

def att_to_key(d: dict, attributes: dict) -> int:
    for k,v in d.items():
        if v == attributes:
            return k

如果您执行以下操作,d 是您的原始字典,属性是您要查找的属性字典

f = att_to_key(d, {"a","b","c"})
print(f)

它输出你的 0

不确定为什么要使用 pandas。这是一个纯粹的 python 解决方案。

您可以反转字典以使用 frozenset 作为键:

d = {0: {'a', 'b', 'c'},
     1: {'a', 'b', 'c', 'd'},
     2: {'k', 'b', 'e', 'a', 'n'}}

rev_d = {frozenset(k): v for v,k in d.items()}

rev_d[frozenset({'a', 'c', 'b'})]
# 0