Python 列表字典-在字典中查找项';s(列表)是相同的

Python 列表字典-在字典中查找项';s(列表)是相同的,python,pandas,dictionary,Python,Pandas,Dictionary,我正在寻找一种方法来识别字典中相同项的键-但是,有数百个键,每个项都是长度不超过60-70个元素的列表 我想找到所有具有相同项的键;我找到了这个,带着它到了某个地方 但当项目是列表时,这是一个问题。我将列表转换为字符串,并尝试了翻转路径,但键很难操作(大量列表为字符串),而且似乎不符合Python 样本: foo = {'123':['ham','salami','beef','bacon','lamb-chop'], '124':['ham','salami','bacon',

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

我想找到所有具有相同项的键;我找到了这个,带着它到了某个地方 但当项目是列表时,这是一个问题。我将列表转换为字符串,并尝试了翻转路径,但键很难操作(大量列表为字符串),而且似乎不符合Python

样本:

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']

它们是分开的

输出可以是一个字典,例如:

'Group 1':['124,'125'],
'Group 2':['123'],
'Group 3':['126']
其中所有分组都表示它们具有相同的列表元素。我不介意太多-只是想避免600多个字符串作为字典的键

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


我还有第二个问题与此相关,因此发布后我会在此处添加一个链接…

您可以构建一个反向dict,其中列表作为键(必须转换为不可变元组),匹配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']})
从集合导入defaultdict
foo={'123':['火腿','萨拉米','牛肉','培根','羊排',
‘124’:[‘火腿’、‘萨拉米’、‘培根’、‘胡椒’],
‘125’:[‘火腿’、‘萨拉米’、‘培根’、‘胡椒’],
'126':['salami','bacon','lamb-chop']
list_to_id=defaultdict(列表)
对于键,foo.items()中的lst:
列表到ID[元组(lst)]。追加(键)
打印(从列表到ID)
#defaultdict(,{(“火腿”、“腊肠”、“牛肉”、“培根”、“羊排”):['123'],
#(‘火腿’、‘腊肠’、‘培根’、‘胡椒’):[124]、[125],
#(‘萨拉米’、‘培根’、‘羊排’:['126']})

什么是“能够识别”呢?你能告诉我们你期望的具体产量吗?这能回答你的问题吗@yatu我编辑了ClarifyThreak@Thierrylahuille-这是我目前的方法-使用列表作为键-但是列表非常长,这使得进一步的工作非常棘手。你可以总是
hash()
当您不需要知道列表中的内容时,使用列表和哈希,并在需要时将哈希映射回列表。这就是您在问题中提出的问题。。。用较短的id替换密钥是一个完全不同的问题,您应该澄清您想要什么。如果你不需要人类可以使用的东西,@quamrana建议使用散列,这可能是个好主意。@quamrana-谢谢,这似乎是我正在寻找的方式(蒂埃里也指出了-谢谢)。我不熟悉散列,但认为这是一个单向的过程-如何取回原始列表?您将原始列表保留在一个新的
目录中,并由散列键控,
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']})