Roe*_*ler 85 python dictionary
我收到一个字典作为输入,并希望返回一个字典,其键将是输入的值,其值将是相应的输入键.价值观是独一无二
例如,说我的输入是:
a = dict()
a['one']=1
a['two']=2
Run Code Online (Sandbox Code Playgroud)
我希望我的输出是:
{1: 'one', 2: 'two'}
Run Code Online (Sandbox Code Playgroud)
为了澄清我希望我的结果等同于以下内容:
res = dict()
res[1] = 'one'
res[2] = 'two'
Run Code Online (Sandbox Code Playgroud)
任何巧妙的Pythonian方式来实现这一目标?
谢谢
lio*_*ori 136
Python 2:
res = dict((v,k) for k,v in a.iteritems())
Run Code Online (Sandbox Code Playgroud)
Python 3(感谢@erik):
res = dict((v,k) for k,v in a.items())
Run Code Online (Sandbox Code Playgroud)
Jav*_*ier 53
new_dict = dict (zip(my_dict.values(),my_dict.keys()))
Run Code Online (Sandbox Code Playgroud)
Sil*_*ost 44
从Python 2.7开始,包括3.0+,有一个可以说更短,更易读的版本:
>>> my_dict = {'x':1, 'y':2, 'z':3}
>>> {v: k for k, v in my_dict.items()}
{1: 'x', 2: 'y', 3: 'z'}
Run Code Online (Sandbox Code Playgroud)
sun*_*ang 30
In [1]: my_dict = {'x':1, 'y':2, 'z':3}
In [2]: dict((value, key) for key, value in my_dict.iteritems())
Out[2]: {1: 'x', 2: 'y', 3: 'z'}
Run Code Online (Sandbox Code Playgroud)
Aka*_*all 28
你可以使用dict理解:
res = {v: k for k, v in a.iteritems()}
Run Code Online (Sandbox Code Playgroud)
编辑:对于Python 3,使用a.items()
而不是a.iteritems()
.关于它们之间的差异的讨论可以在Python的SO上的iteritems中找到.
Ala*_*air 18
你可以尝试:
d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.iteritems())
d2
{'two': 2, 'one': 1}
Run Code Online (Sandbox Code Playgroud)
请注意,如果你不能"反转"字典
{'one':1,'two':1}
.新词典只能有一个带键的项目1
.{'one':[1]}
.[1]
是有效值,但不是有效密钥.请参阅python邮件列表中的此主题以获取有关该主题的讨论.
pki*_*kit 14
res = dict(zip(a.values(), a.keys()))
bal*_*pha 14
new_dict = dict( (my_dict[k], k) for k in my_dict)
Run Code Online (Sandbox Code Playgroud)
甚至更好,但只适用于Python 3:
new_dict = { my_dict[k]: k for k in my_dict}
Run Code Online (Sandbox Code Playgroud)
Han*_*art 11
当前的主要答案假定值是唯一的,但并非总是如此.如果值不是唯一的怎么办?你会丢失信息!例如:
d = {'a':3, 'b': 2, 'c': 2}
{v:k for k,v in d.iteritems()}
Run Code Online (Sandbox Code Playgroud)
回报{2: 'b', 3: 'a'}
.
有关的信息'c'
完全被忽略了.理想情况下应该是这样的{2: ['b','c'], 3: ['a']}
.这是底层实现的功能.
def reverse_non_unique_mapping(d):
dinv = {}
for k, v in d.iteritems():
if v in dinv:
dinv[v].append(k)
else:
dinv[v] = [k]
return dinv
Run Code Online (Sandbox Code Playgroud)
Sun*_*tel 10
扩展Ilya Prokin的反应的另一种方法是实际使用该reversed
功能.
dict(map(reversed, my_dict.items()))
Run Code Online (Sandbox Code Playgroud)
本质上,您的字典是通过(使用.items()
)迭代的,其中每个项目是键/值对,并且这些项目与reversed
函数交换.当它传递给dict
构造函数时,它会将它们转换为您想要的值/键对.
小智 6
改善哈维尔答案的建议:
dict(zip(d.values(),d))
Run Code Online (Sandbox Code Playgroud)
而不是d.keys()
您只能编写d
,因为如果您使用迭代器浏览字典,它将返回相关字典的键。
例如 对于这种行为:
d = {'a':1,'b':2}
for k in d:
k
'a'
'b'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
78379 次 |
最近记录: |