我有一个由{key: value}
组成的字典。
我从这本词典中选择一组键。
我想用{keyA: set of all keys wich have the same value as 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])
答案 0 :(得分:1)
试试这个
>>> 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]}
答案 1 :(得分:1)
def convert(d):
result = {}
for k, v in d.items(): # or d.iteritems() if using python 2
if v not in result:
result[v] = set()
result[v].add(k)
return result
或者如果您在以后不小心访问任何非密钥时只使用collections.defaultdict(set)
: - )
答案 2 :(得分:0)
因为您从原始字典中选择一组键。我们可以为您的目的修改@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]}
答案 3 :(得分:0)
@Patrick Haugh的评论中提到了这一点:
d=your dictionary
s=set(d.values())
d2={i:[] for i in s}
for k in d:
d2[d[k]].append(k)
答案 4 :(得分:0)
因此,您希望为给定源词典中的每个选定键创建一个将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'}}
实现此目的的一种方法是使用defaultdict为密钥表构建一个值,然后使用它来从指定的密钥构建所需的结果:
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'}}