在python中的字典中切换键和值[重复]
Posted
技术标签:
【中文标题】在python中的字典中切换键和值[重复]【英文标题】:switching keys and values in a dictionary in python [duplicate] 【发布时间】:2012-01-08 11:35:50 【问题描述】:假设我有一本这样的字典:
my_dict = 2:3, 5:6, 8:9
有没有办法可以切换键和值来获取:
3:2, 6:5, 9:8
【问题讨论】:
值是否唯一?这些值是可散列的吗?my_new_dict = dict(zip(my_dict.values(), my_dict.keys()))
怎么样
【参考方案1】:
my_dict2 = dict((y,x) for x,y in my_dict.iteritems())
如果您使用的是 python 2.7 或 3.x,则可以改用字典推导:
my_dict2 = y:x for x,y in my_dict.iteritems()
编辑
正如 JBernardo 在 cmets 中所述,对于 python 3.x,您需要使用 items
而不是 iteritems
【讨论】:
.iteritems()
在 Python 3.x 上无效...
@JBernardo:解决了,谢谢,我忘了
另一个更正 - 执行您建议的字典理解 (y, x) for x, y in dic_cols_w.items()
返回一个集合,而不是字典。您仍然需要将其包装在 dict(...)
中以获取字典
@tsando:我认为你读错了我的答案。我有y:x ...
如果值是一个项目列表并且列表中的每个项目都应该是一个键,你会怎么做?【参考方案2】:
my_dict = my_dict[k]:k for k in my_dict
【讨论】:
清理回答这个。【参考方案3】:试试这个:
my_dict = 2:3, 5:6, 8:9
new_dict =
for k, v in my_dict.items():
new_dict[v] = k
【讨论】:
【参考方案4】:使用Python reverse / invert a mapping 接受的答案中的此代码(稍作修改):
dict((v,k) for k, v in my_dict.iteritems())
请注意,这假定原始字典中的值是唯一的。否则,您最终会在结果字典中得到重复的键,这是不允许的。
而且,正如@wim 指出的那样,它还假设这些值是可散列的。如果您不确定什么是可散列的和不可散列的,请参阅 the Python glossary。
【讨论】:
【参考方案5】:也许:
flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))
【讨论】:
这可能不安全,因为它依赖于键和值排序,尽管它碰巧对我有用。我喜欢 JBernardo/GWW 的回答。 使用iterkeys
和itervalues
可能会更好
如果在操作过程中不更改dict,那是安全的。我喜欢,因为你没有理解就这样做了。【参考方案6】:
首先,不保证这是可能的,因为字典的值可能是不可散列的。
如果不是,我们可以使用函数式方法:
reversed_dict = dict(map(reversed, original_dict.items()))
【讨论】:
【参考方案7】:有时,值都是唯一的条件不成立,在这种情况下,上述答案将破坏所有重复值。
以下将可能重复的值汇总到一个列表中:
from itertools import count
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())])
我确定有更好的(非列表组合)方法,但我对早期的答案有疑问,所以我想我会提供我的解决方案,以防其他人有类似的用例。
附:不要指望 dict 在对原作进行任何更改后仍能保持整齐排列!此方法只能在静态字典上一次性使用 - 您已被警告!
【讨论】:
【参考方案8】:如果值不是唯一的,这将在转换中与键空间发生冲突。 最好是在切换位置时将键保留在列表中
下面处理这个 -
RvsD = dict()
for k,v in MyDict.iteritems():
RsvD.setdefault(v, []).append(k)
【讨论】:
【参考方案9】:你可以这样做:
功能:
def inverse_dict(my_dict):
updated_dict =
for i in my_dict:
updated_dict[my_dict[i]] = [i]
return updated_dict
主要():
def main():
year = 'day': 15, 'month': 3, 'year': 2019
print(inverse_dict(year))
if __name__ == "__main__":
main()
输出:
15: ['day'], 3: ['month'], 2019: ['year']
【讨论】:
【参考方案10】:如果值在字典中不是唯一的,那么您可以将键映射到该值。这是一个如何使用 defaultdict 的示例
from collections import defaultdict
def reverse_dict(data: dict) -> dict:
rd = defaultdict(list)
for k, v in data.items():
rd[v].append(k)
return rd
if __name__ == "__main__":
from collections import Counter
data = "aaa bbb ccc ddd aaa bbb ccc aaa"
c = Counter(data.split())
print(c)
# Counter('aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1)
rd = reverse_dict(c)
print(rd)
# defaultdict(<class 'list'>, 3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd'])
【讨论】:
以上是关于在python中的字典中切换键和值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python3基础 dict keys+values 循环打印字典中的所有键和值