Python 如何获取给定的dict并为一个键返回一个具有多个值的新dict?

Python 如何获取给定的dict并为一个键返回一个具有多个值的新dict?,python,dictionary,Python,Dictionary,我是python新手,正在努力解决这个问题-创建一个如下所示的函数: d={1:x,2:y,3:x,4:z} 倒拱d(d) {“x”:(1,3),“y”:(2),“z”:(4)} 因此,invert\u d给出了一个新的dict,其中包含多个键的值作为列表 我不得不说,我从未使用过dicts,一周前开始使用python……所以我完全是个新手 我是python新手。。。。我正在努力解决这个问题: 编辑:我读错了,修正了这句话。对不起,伙计们:( 此外,我们无法在考试中导入dict将一个值与特定键

我是python新手,正在努力解决这个问题-创建一个如下所示的函数:

d={1:x,2:y,3:x,4:z}
倒拱d(d)
{“x”:(1,3),“y”:(2),“z”:(4)}
因此,
invert\u d
给出了一个新的dict,其中包含多个键的值作为列表

我不得不说,我从未使用过dicts,一周前开始使用python……所以我完全是个新手

我是python新手。。。。我正在努力解决这个问题:

编辑:我读错了,修正了这句话。对不起,伙计们:(


此外,我们无法在考试中导入dict将一个值与特定键关联,因此原始dict
d
将看到键“x”的两个不同值(先是1,然后是3),最后一个值将替换以前的值。如果您有权访问交互式Python会话,则如下所示:

$ python
Python 3.9.1 (default, Dec 13 2020, 11:55:53) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {"x": 1, "y": 2, "x": 3, "z": 5}
>>> d
{'x': 3, 'y': 2, 'z': 5}
(这里的
d
本身只是要求Python使用
print
来显示当前值,就好像您调用了
print(d)

现在你有了一些选择,你可以定义一个dict来包含你想要的最终值:
{“x”:(1,3),“y”:(2,),“z”:(5,)}
。或者,如果您确实有一个流的源或一组值,您希望使用您描述的函数将其处理为dict,我们也可以这样做,但我们需要使用元组列表之类的内容作为输入,而不是dict:
l=[((“x”,1),(“y”,2),(“x”,3),(“z”,5)]
。有了输入的新概念,我们可以编写一个函数,以某种方式处理列表中的每个元素,并将这些元素编译成一个特定的dict。下面是一种查看(无任何错误处理)的方法:

编辑:在提交上述内容后,我现在意识到您确实想要反转您的dict,可能看起来像这样:

from functools import reduce

def add_tuple_to_dict(d, t): # here `d` is the dict and `t` is the tuple
  if t[1] in d:
    d[t[1]].append(t[0])
  else:
    d[t[1]] = [t[0],]
  return d

def invert_d(d):
  return reduce(add_tuple_to_dict, d.items(), {})
您可以使用最初创建字典,其中包含以列表为值的键。然后将其转换为包含以元组为值的键的dict:

导入集合
d={1:x',2:y',3:x',4:z}
def反转(d):
#首先是以列表作为值的dict
inv=集合。默认目录(列表)
对于d.项()中的k,v:
#请注意,上一个值是反转dict的键
存货[v]。追加(k)
#然后将现有的“值列表”转换为“值元组”
inv={k:k的元组(v),inv.items()中的v
退货库存
仰拱(d)
#{'x':(1,3),'y':(2,),'z':(4,)}
defaultdict
所做的是,当在dict中查找(获取或设置)一个值时,如果该值不存在,它会自动使用提供的默认工厂创建一个值。在这种情况下,
list

因此,在查找时,每个值都被设置为一个空列表。在循环中,新值(旧值的键)被追加到此列表。如果新值以前不存在,则将其追加到空列表中。如果新值确实存在(来自上一次迭代)并且具有值,则将新值追加到该列表中


由于最后需要的是值的元组而不是列表,因此我有一个字典理解,它使用相同的键并将值转换为元组。

您可以进行反向查找

invert_d=lambda d:{v:[k代表d中的k,如果d中的v的d[k]==v]值()}
您可以将
v
读取为值,将
k
读取为键

d={1:x,2:y,3:x,4:z}
倒拱d(d)
{'x':[1,3],'y':[2],'z':[4]}
编辑

也许有一个简单的解释:这是一个使用两个。一个作为值,一个外部值来包装它(实际上是一个字典理解,但工作原理相同)。
这不是真正的性能,但对于每天的使用来说已经足够了。

您可以使用setdefault方法简化字典的构造。一种非常基本的方法是:

d={1:"x",2:"y",3:"x",4:"z"}

def invertDict(d):
    result = dict()
    for k,v in d.items(): result.setdefault(v,[]).append(k)
    return result

print(invertDict(d))

{'x': [1, 3], 'y': [2], 'z': [4]}
如果需要一行解决方案,可以使用字典理解。下面是一个以元组形式输出键列表的解决方案:

def invertDict(d):
    return {v:tuple(inv[v]) for inv in [{}] for k,v in d.items() if [inv.setdefault(v,[]).append(k)] }

print(invertDict(d))

{'x': (1, 3), 'y': (2,), 'z': (4,)}

字典中的键必须是唯一的。你的
d
不是有效的字典。@ChrisCharley它在语法上是有效的字典。但最后它只会保留键的后面的值。@ChrisCharley抱歉,我读错了,并修复了这个Dict。我不小心交换了键和值:xthanks,在考试中我们无法导入新的东西,并且没有o使用基础python提供的
集合
不是一个外部包,它是“基础”的一部分Python随附。如果您不想或无法导入外部包,请在问题中明确提及。抱歉,我已修复了它。您可以添加一个版本,其中我解释的逻辑是显式编码的。它的工作原理在我的答案解释中。请先尝试自己编写。谢谢,在考试中,我们无法导入新内容和have使用python提供的基础知识
def invertDict(d):
    return {v:tuple(inv[v]) for inv in [{}] for k,v in d.items() if [inv.setdefault(v,[]).append(k)] }

print(invertDict(d))

{'x': (1, 3), 'y': (2,), 'z': (4,)}