Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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
基于值的Python3字典合并_Python_Python 3.x_Dictionary_Merge - Fatal编程技术网

基于值的Python3字典合并

基于值的Python3字典合并,python,python-3.x,dictionary,merge,Python,Python 3.x,Dictionary,Merge,我有一本由{key:value}组成的字典 我从这本字典中选择了一组键 我想用{keyA:set of all key,其值与keyA}建立一个新字典 我已经有了一个解决办法:有没有更快的方法 这对我来说似乎很慢,我想我不是唯一一个在这种情况下 for key1 in selectedkeys: if key1 not in seen: seen.add(key1) equal[key1] = set([key1])#egual to itself

我有一本由
{key:value}
组成的字典

我从这本字典中选择了一组键

我想用
{keyA:set of all key,其值与keyA}
建立一个新字典

我已经有了一个解决办法:有没有更快的方法

这对我来说似乎很慢,我想我不是唯一一个在这种情况下

for key1 in selectedkeys:
    if key1 not in seen:
        seen.add(key1)
        equal[key1] = set([key1])#egual to itself
        for key2 in selectedkeys:
            if key2 not in seen and dico[key1] == dico[key2]:
                equal[key1].add(key2)
        seen.update(equal[key1])
试试这个

>>> a = {1:1, 2:1, 3:2, 4:2}
>>> ret_val = {}
>>> for k, v in a.iteritems():
...     ret_val.setdefault(v, []).append(k)
...
>>> ret_val
{1: [1, 2], 2: [3, 4]}

因为您从原始字典中选择了一组键。我们可以根据您的需要修改@Nilesh解决方案

a = {1:1, 2:1, 3:2, 4:2}
keys = [1, 3]  # lets say this is the list of keys
ret_val = {}
for i in keys:
  for k,v  in a.items():
    if a[i]==v:
      ret_val.setdefault(i, []).append(k)
print (ret_val)

{1: [1, 2], 3: [3, 4]}

或者,如果您足够小心,以后不要访问任何非键,请使用:-)

这是@Patrick Haugh在评论中所说的:

d=your dictionary
s=set(d.values())
d2={i:[] for i in s}
for k in d:
    d2[d[k]].append(k)

因此,您希望为给定源词典中的每个选定键创建一个字典,将
key
映射到“与
key
具有相同值的所有键集”

因此,如果源词典是:

{'a': 1, 'b': 2, 'c': 1, 'd': 2, 'e': 3, 'f': 1, 'g': 3)
选择的键是
a
b
e
,结果应该是:

{'a': {'a', 'c', 'f'}, 'e': {'g', 'e'}, 'b': {'b', 'd'}}
实现这一点的一种方法是使用构建键表的值,然后使用该表从指定的键构建所需的结果:

from collections import defaultdict

def value_map(source, keys):
    table = defaultdict(set)
    for key, value in source.items():
        table[value].add(key)
    return {key: table[source[key]] for key in keys}

source = {'a': 1, 'b': 2, 'c': 1, 'd': 2, 'e': 3, 'f': 1, 'g': 3)

print(value_map(source, ['a', 'b', 'e']))
输出:

{'a': {'a', 'c', 'f'}, 'e': {'g', 'e'}, 'b': {'b', 'd'}}

你能给出一个输入输出的例子吗?建立一个映射
{value:set(keys)}
的字典可能会更快。这比我做的要快得多。我想会有一个选择使用类似计数器库的东西,这是退出快!
{'a': {'a', 'c', 'f'}, 'e': {'g', 'e'}, 'b': {'b', 'd'}}