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

时间:2017-11-01 11:20:30

标签: python dictionary get key

也许dict不打算以这种方式使用,但我需要在同一个键上添加多个值。我的意图是使用一种暂时的财产。如果我的字典是A:BB:C,那么我希望得到字典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':[4869,629,427'], '13':['2']}

3 个答案:

答案 0 :(得分:0)

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

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

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

l = list(numDict) # list of keys
l1 = {i:-1 for i in numDict} # to track visited keys (initialized to -1 initially)

for i in numDict:
    # if key is root and diving in is possible
    if l1[i] == -1 and numDict[i][0] in l:
        t = numDict[i][0]
        while(t in l): # dive deeper and deeper
            numDict[i].extend(numDict[t]) # update the value of key
            l1[t] = 1 # mark as visited
            t = numDict[t][0]
# filter the root keys
answer = {i:numDict[i] for i in numDict if l1[i] == -1}
print(answer)

输出:

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

答案 1 :(得分:0)

def unchain(d):
    #assemble a collection of keys that are not also values. These will be the keys of the final dict. 
    top_level_keys = set(d.keys()) - set(d.values())

    result = {}
    for k in top_level_keys:
        chain = []
        #follow the reference chain as far as necessary.
        value = d[k]
        while True:
            if value in chain: raise Exception("Referential loop detected: {} encountered twice".format(value))
            chain.append(value)
            if value not in d: break
            value = d[value]           
        result[k] = chain
    return result

numDict={'60':'4869', '4869':'629', '13':'2', '629':'427'}
print(unchain(numDict))

结果:

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

您可能会注意到我更改了numDict的布局,因为如果值不是单元素列表,则更容易处理。{x>}但是,如果您仍然保持这种状态,则只需将d = {k:v[0] for k,v in d.items()}添加到unchain的顶部,即可将其从一个转换为另一个。

答案 2 :(得分:0)

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

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

限制:

评论中提到的周期。
非唯一键
非唯一值
可能需要处理一些角落案件。