我已经从元组创建了一个字典,但似乎无法在不编辑原始元组的情况下找到关于我如何切换我的键和值的答案。这就是我到目前为止所做的:
tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')]
dic = dict(tuples)
print dic
这给出了输出:
{'a': '1', 'b': ''1', 'c': '2', 'd': '3'}
但我正在寻找:
{'1': 'a' 'b', '2': 'c', '3': 'd'}
是否有一个简单的代码可以产生这个?
答案 0 :(得分:2)
在循环中构建字典,将值收集到列表中:
result = {}
for value, key in tuples:
result.setdefault(key, []).append(value)
如果密钥不存在,dict.setdefault()
method将设置并返回默认值。如果密钥不存在,我用它来设置默认的空列表值,因此.append(value)
始终应用于列表对象。
请勿尝试将此字符串和多字符串列表值组合在一起,您只会使事情变得复杂。
演示:
>>> tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')]
>>> result = {}
>>> for value, key in tuples:
... result.setdefault(key, []).append(value)
...
>>> result
{'1': ['a', 'b'], '3': ['d'], '2': ['c']}
答案 1 :(得分:0)
from operator import itemgetter
from itertools import groupby
first = itemgetter(0)
second = itemgetter(1)
d = dict((x, [v for _, v in y]) for x, y in groupby(sorted(tuples, key=second), key=second)
groupby
将元组分组为元组的新迭代器,其第一个元素是每个元素的唯一第二个元素,其第二个元素是另一个迭代器,由相应的元素组成第一项。一个简单的例子(为清晰起见而打印漂亮):
>>> list(groupby(sorted(tuples, key=second), key=second)))
[('1', <itertools._grouper object at 0x10910b8d0>),
('2', <itertools._grouper object at 0x10910b790>),
('3', <itertools._grouper object at 0x10910b750>)]
必须使用groupby
使用的相同密钥进行排序,以确保所有相似的项目组合在一起; groupby
只会在列表中进行一次传递。
子服务器由('1', 'a')
之类的元组组成,因此每个项目中的 second 值是我们要添加到新字典中的值的值。
答案 2 :(得分:0)
d = {}
tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')]
for keys, values in tuples:
d[keys] = values
您将获得:
{'a': '1', 'b': '1', 'c': '2', 'd': '3'}