设置向上
我有一个大字典,列表中包含唯一键,唯一值和非唯一值。
字典看起来像,
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
问题
我想交换键和值,
d_inverse = {'1': ['a', 'b', 'c'], '2': ['a'],'3': ['a', 'c']}
我找到了关于交换键和值的以下答案,
关于使用列表中的值交换键,
最后一个答案很接近,但不管理列表中的非唯一值。
即,
{k: oldk for oldk, oldv in d.items() for k in oldv}
生成
{'1': 'c', '2': 'a', '3': 'c'}
如何计算非唯一值并且不丢失信息?
答案 0 :(得分:3)
一种方法是使用collections.defaultdict
:
public class TreeItem : PropertyChangedBase
{
private string name;
public string Name
{
get => name;
set
{
name = value;
NotifyOfPropertyChange(() => Name);
}
}
public ObservableCollection<TreeItem> Children { get; } = new ObservableCollection<TreeItem>();
}
答案 1 :(得分:1)
使用for-loop
d = {'a': ['1','2','3'],'b': [1],'c': ['1','3']}
res = {}
for k,v in d.items(): #Iterate dictionary.
for i in v: #Iterate List
i = str(i) #Convert element to string
if i not in res: #Check if key in dictionary.
res[i] = [k]
else:
res[i].append(k) #Else append element.
print(res)
<强>输出:强>
{'1': ['a', 'c', 'b'], '3': ['a', 'c'], '2': ['a']}
答案 2 :(得分:1)
有人回答了这个问题here
inv_map = {}
for k, v in my_map.iteritems():
inv_map.setdefault(v, []).append(k)
通过一个小小的改动它可以按照我们想要的方式工作:
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
inv_map = {}
for k, vs in d.items():
for v in vs:
inv_map.setdefault(v, []).append(k)
print(inv_map)
>>> {'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}
答案 3 :(得分:0)
您还可以使用词典理解:
from string import ascii_lowercase as alphabet
d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
new_d = {str(alphabet.index(a)+1):[alphabet[int(i)-1] for i in b] for a, b in d.items()}
输出:
{'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}