将字典反转为键:值列表?
Reverse a dictionary to key : list of values?
如何将 python 字典 d = {1:10, 2:20, 3:30, 4:30}
转换为 {10: [1], 20: [2], 30: [3, 4]}
?
我需要反转字典,值应该成为另一个字典的键,值应该是列表中的键,即也在排序的事物中。
o = {}
for k,v in d.iteritems():
if v in o:
o[v].append(k)
else:
o[v] = [k]
o = {10: [1], 20: [2], 30: [3, 4]}
d = {1:10, 2:20, 3:30, 4:30}
inv = {}
for key, val in d.iteritems():
inv[val] = inv.get(val, []) + [key]
试试这个!
这个用例很容易被 dict.setdefault()
处理
>>> d = {1:10, 2:20, 3:30, 4:30}
>>> e = {}
>>> for x, y in d.items():
e.setdefault(y, []).append(x)
>>> e
{10: [1], 20: [2], 30: [3, 4]}
另一种方法是使用 collections.defaultdict。这有一个稍微复杂的设置,但内部循环访问比 setdefault 方法更简单和更快。此外,它 returns 一个字典子类而不是一个普通的字典:
>>> e = defaultdict(list)
>>> for x, y in d.items():
e[y].append(x)
>>> e
defaultdict(<class 'list'>, {30: [3, 4], 10: [1], 20: [2]})
反转 python 字典中的键和值有点棘手。你应该记住 python 字典必须有一个 unique
键。
因此,如果您知道在反转当前字典的键和值时将具有唯一键,您可以使用简单的 dict comprehension
就像这个例子:
{v:k for k,v in my_dict.items()}
但是,您可以使用 itertools
模块中的 groupby
,如下例所示:
from itertools import groupby
a = {1:10, 2:20, 3:30, 4:30}
b = {k: [j for j, _ in list(v)] for k, v in groupby(a.items(), lambda x: x[1])}
print(b)
>>> {10: [1], 20: [2], 30: [3, 4]}
如何将 python 字典 d = {1:10, 2:20, 3:30, 4:30}
转换为 {10: [1], 20: [2], 30: [3, 4]}
?
我需要反转字典,值应该成为另一个字典的键,值应该是列表中的键,即也在排序的事物中。
o = {}
for k,v in d.iteritems():
if v in o:
o[v].append(k)
else:
o[v] = [k]
o = {10: [1], 20: [2], 30: [3, 4]}
d = {1:10, 2:20, 3:30, 4:30}
inv = {}
for key, val in d.iteritems():
inv[val] = inv.get(val, []) + [key]
试试这个!
这个用例很容易被 dict.setdefault()
处理>>> d = {1:10, 2:20, 3:30, 4:30}
>>> e = {}
>>> for x, y in d.items():
e.setdefault(y, []).append(x)
>>> e
{10: [1], 20: [2], 30: [3, 4]}
另一种方法是使用 collections.defaultdict。这有一个稍微复杂的设置,但内部循环访问比 setdefault 方法更简单和更快。此外,它 returns 一个字典子类而不是一个普通的字典:
>>> e = defaultdict(list)
>>> for x, y in d.items():
e[y].append(x)
>>> e
defaultdict(<class 'list'>, {30: [3, 4], 10: [1], 20: [2]})
反转 python 字典中的键和值有点棘手。你应该记住 python 字典必须有一个 unique
键。
因此,如果您知道在反转当前字典的键和值时将具有唯一键,您可以使用简单的 dict comprehension
就像这个例子:
{v:k for k,v in my_dict.items()}
但是,您可以使用 itertools
模块中的 groupby
,如下例所示:
from itertools import groupby
a = {1:10, 2:20, 3:30, 4:30}
b = {k: [j for j, _ in list(v)] for k, v in groupby(a.items(), lambda x: x[1])}
print(b)
>>> {10: [1], 20: [2], 30: [3, 4]}