【问题标题】:Reverse dictionary attributes set to ids?反向字典属性设置为ids?
【发布时间】:2022-01-06 12:56:21
【问题描述】:

我有以下翻译词典:

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

我想将它“反转”为键的属性(这里的键是 id 的一种形式)。 给定一组属性,给我相关的 id(键)。

例如,给定{'a', 'b', 'c'} 返回0

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

【问题讨论】:

  • 这取决于数据量。高达 e。 G。 100k 键 dict 和 sets 的简单方法应该可以工作。
  • 您可以查看frozenset。由于它是可散列的,因此可以将其作为键传递给反向字典。
  • 使用{frosenset(v): k for k,v in data.items()}(假设值是唯一的)然后在查找密钥时转换为冻结集

标签: python pandas dictionary set


【解决方案1】:

不确定为什么要使用 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

【讨论】:

  • 太好了,我会和谷歌教授核实一下 set 和 freeze set 有什么区别。
  • @SteveS 我提供了文档的链接;)这就像一个集合但不可变
  • 它是可散列的,因为它是不可变的;)
  • 澄清一下,我在以下问题的最后一个答案中看到 Serge 的评论说重要的是可散列部分。你能解释一下为什么它是不可变的部分吗? @mozway stackoverflow.com/questions/36555214/…
  • 为了清楚起见,需要将 hashability 用作键,但frozensets 是可散列的事实是因为它们是不可变,如果对象可以更改(这将更改其哈希),那么将对象存储在哈希表(字典)中没有多大意义。我希望这可以澄清;)
【解决方案2】:

您可以使用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

【讨论】:

  • 它是否可扩展?并感谢您的方法!不明白为什么人们对你的答案和我的问题投了反对票……
  • 我没有否决答案或问题,但我很确定这需要扫描整个系列的每个查询。
  • 是的 - 这不是“缓存”方法,如果这是任务的更广泛要求,它只是在 pandas 中实现此目的的一种方式。
【解决方案3】:

您可以遍历整个 dict 并查找匹配项,如下所示:

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

如果您的 then 使用 d 作为您的原始字典,而 attributes 是您要查找的属性字典,请执行以下操作

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

它输出你的 0

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多