Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否通过字典中的多个值获取密钥?_Python_Dictionary_Get_Key - Fatal编程技术网

Python 是否通过字典中的多个值获取密钥?

Python 是否通过字典中的多个值获取密钥?,python,dictionary,get,key,Python,Dictionary,Get,Key,也许dict不打算以这种方式使用,但我需要向同一个键添加多个值。我的意图是使用一种临时财产。如果我的dict是A:B和B:C,那么我想要dictA:[B,C] 为了更好地解释我想做什么,让我们举个例子: numDict={'60':['4869'], '4869':['629'], '13':['2']} 我希望它能返回: {'60':['4869','629'], '13':['2']} 对于两个元素,可以使用如下内容: result={} for key in numDict.keys(

也许
dict
不打算以这种方式使用,但我需要向同一个键添加多个值。我的意图是使用一种临时财产。如果我的dict是
A:B
B:C
,那么我想要dict
A:[B,C]

为了更好地解释我想做什么,让我们举个例子:

numDict={'60':['4869'], '4869':['629'], '13':['2']}
我希望它能返回:

{'60':['4869','629'], '13':['2']}
对于两个元素,可以使用如下内容:

result={}
for key in numDict.keys():
    if [key] in numDict.values():
        result[list(numDict.keys())[list(numDict.values()).index([key])]]=[key]+numDict[key]

但是如果我有更多的元素呢?例如:

numDict={'60':['4869'], '4869':['629'], '13':['2'], '629':['427'}

我能做些什么才能得到返回{'60':[4869629427'],'13':['2']}?

我已经为它写了一个代码。看看是否有帮助

我所做的是继续潜入,直到我能去(希望你能理解这句话),并将他们标记为已访问,因为不再需要他们。最后,我过滤掉根键

输出:

{'60': ['4869', '629', '427'], '13': ['2']}
结果:

{'60': ['4869', '629', '427'], '13': ['2']}

您可能会注意到,我更改了
numDict
的布局,因为如果值不是一个元素列表,则更容易处理。但是,如果你死心塌地想保持这种状态,你可以将
d={k:v[0]for k,v in d.items()
添加到
uncain
的顶部,从一个转换到另一个。

你可以构建自己的结构,包括
(值,键)
的反向映射和
(键,[值])的字典。
。添加一个
键、值
对包括通过反向映射跟踪一系列现有条目,直到找到正确的位置;如果不存在,则会引入一个新的密钥条目:

class Groupir:
    def __init__(self):
        self.mapping = {}
        self.reverse_mapping = {}

    def add_key_value(self, k, v):
        self.reverse_mapping[v] = k
        val = v
        key = k
        while True:
            try:
                self.reverse_mapping[val]
                key = val
                val = self.reverse_mapping[val]
            except KeyError:
                try:
                    self.mapping[val].append(v)
                except KeyError:
                    self.mapping[val] = [v]
                break
使用此测试客户端:

groupir = Groupir()
groupir.add_key_value(60, 4869)
print(groupir.mapping)
groupir.add_key_value(4869, 629)
print(groupir.mapping)
groupir.add_key_value(13, 2)
print(groupir.mapping)
groupir.add_key_value(629, 427)
print(groupir.mapping)
产出: 限制: 注释中提到的周期。
非唯一键
非唯一值

可能有一些角落的案子需要处理。

那么到底是什么问题呢?你试过什么?我真的觉得这不容易。在python中,字典没有顺序,因此不可能知道键是否位于链的顶部。这听起来像是要传递闭包,只是之后还要删除“中间”项。您希望如何处理循环引用,例如
{1:[2],2:[1]}
?或者你确定循环不会发生吗?MaorVeitsman问题是,如果有两个以上的元素,代码就不能工作,我不知道如何继续。Cᴏʟᴅsᴘᴇᴇᴅ 是的,我知道,但是哪种类型更好?TomKarzes我很确定不会有那些循环引用。查找“传递闭包”,并在它之后进行一个post传递,以删除每个具有前置节点的节点(但请注意,您将在过程中删除循环)。
class Groupir:
    def __init__(self):
        self.mapping = {}
        self.reverse_mapping = {}

    def add_key_value(self, k, v):
        self.reverse_mapping[v] = k
        val = v
        key = k
        while True:
            try:
                self.reverse_mapping[val]
                key = val
                val = self.reverse_mapping[val]
            except KeyError:
                try:
                    self.mapping[val].append(v)
                except KeyError:
                    self.mapping[val] = [v]
                break
groupir = Groupir()
groupir.add_key_value(60, 4869)
print(groupir.mapping)
groupir.add_key_value(4869, 629)
print(groupir.mapping)
groupir.add_key_value(13, 2)
print(groupir.mapping)
groupir.add_key_value(629, 427)
print(groupir.mapping)
{60: [4869]}
{60: [4869, 629]}
{60: [4869, 629], 13: [2]}
{60: [4869, 629, 427], 13: [2]}