【问题标题】:Dictionary of lists - find keys in a dictionary for which the item's (lists) are the same列表字典 - 在字典中查找项目(列表)相同的键
【发布时间】:2020-11-03 15:11:28
【问题描述】:

我正在寻找一种方法来识别字典中的项目相同的键 - 但是,有 数百个键,每个项目是最多 60 个的列表-70 个元素长度

我想找到所有具有相同项目的键;我找到了这个并找到了它 https://www.geeksforgeeks.org/python-find-keys-with-duplicate-values-in-dictionary/ 但是当项目是列表时,这是一个问题。我将列表转换为字符串并尝试了翻转路线,但是键很笨拙(大量列表作为字符串),并且似乎不是pythonic。

示例:

foo = {'123':['ham','salami','beef','bacon','lamb-chop'], 
       '124':['ham','salami','bacon','pepper'],
       '125':['ham','salami','bacon','pepper'],
       '126':['salami','bacon','lamb-chop']}

对于上面的示例,我可以识别出它

124, 125 --> ['ham','salami','bacon','pepper']

是相同的,并且

123 --> ['ham','salami','beef','bacon','lamb-chop']

126 --> ['salami','bacon','lamb-chop']

是分开的。

输出可以是如下的字典:

'Group 1':['124,'125'],
'Group 2':['123'],
'Group 3':['126']

分组都表示它们具有相同的列表元素。我不太介意 - 只是想避免 600 多个字符串作为字典的键。

我尝试从字典中构建 pandas 数据框,将项目视为集合并进行比较,但我没有比翻转路线更好地管理它

我有第二个与此相关的问题,所以我会在发布时在这里放一个链接......

【问题讨论】:

标签: python pandas dictionary


【解决方案1】:

您可以使用列表作为键(必须转换为不可变元组)和匹配的 id 列表作为值来构建反向字典:

from collections import defaultdict

foo = {'123':['ham','salami','beef','bacon','lamb-chop'], 
       '124':['ham','salami','bacon','pepper'],
       '125':['ham','salami','bacon','pepper'],
       '126':['salami','bacon','lamb-chop']}

list_to_ids = defaultdict(list)

for key, lst in foo.items():
    list_to_ids[tuple(lst)].append(key)
    
print(list_to_ids)
# defaultdict(<class 'list'>, {('ham', 'salami', 'beef', 'bacon', 'lamb-chop'): ['123'],
# ('ham', 'salami', 'bacon', 'pepper'): ['124', '125'],
# ('salami', 'bacon', 'lamb-chop'): ['126']})

【讨论】:

  • 感谢@ThierryLathuille - 这是我目前的方法 - 使用列表作为键 - 但列表非常长,这使得进一步的工作非常棘手。
  • 您可以随时hash() 列表并在您不需要知道列表中的内容时使用哈希,并在需要时将哈希映射回列表。跨度>
  • 嗯,这就是您在问题中提出的问题...用一些较短的 id 替换键是一个完全不同的问题,您应该澄清您想要什么。正如@quamrana 所建议的那样,如果您不需要人类可用的东西,散列可能是一个好主意。
  • @quamrana - 谢谢,这似乎是我正在寻找的方式(正如蒂埃里也指出的那样 - 也谢谢)。我不熟悉哈希,但认为这是一个单向过程 - 我如何取回原始列表?
  • 您将原始列表保存在一个新的dict 中,并以哈希为键,
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2021-11-12
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多