【发布时间】:2011-04-16 13:26:51
【问题描述】:
对于元组,t = ((1, 'a'),(2, 'b'))
dict(t) 返回{1: 'a', 2: 'b'}
有没有获得{'a': 1, 'b': 2}(交换键和值)的好方法?
最终,我希望能够在给定'a' 或2 给定'b' 的情况下返回1,也许转换为字典不是最好的方法。
【问题讨论】:
标签: python dictionary tuples
对于元组,t = ((1, 'a'),(2, 'b'))
dict(t) 返回{1: 'a', 2: 'b'}
有没有获得{'a': 1, 'b': 2}(交换键和值)的好方法?
最终,我希望能够在给定'a' 或2 给定'b' 的情况下返回1,也许转换为字典不是最好的方法。
【问题讨论】:
标签: python dictionary tuples
试试:
>>> t = ((1, 'a'),(2, 'b'))
>>> dict((y, x) for x, y in t)
{'a': 1, 'b': 2}
【讨论】:
dict(zip(*zip(*t)[::-1]))。这更慢,更丑陋并且使用更多内存..可能是 3 倍。
dict((x, y) for x, y, z in t) 或 dict((x, (y, z)) for x, y, z in t) 将第二个和第三个值作为一个元组。
{y: x for x, y in t}
稍微简单一点的方法:
>>> t = ((1, 'a'),(2, 'b'))
>>> dict(map(reversed, t))
{'a': 1, 'b': 2}
【讨论】:
reverse 明确拼写出来。
map 在被映射的东西是另一个内置函数时比理解更快(例如 reversed );在大多数其他情况下,情况正好相反。但分析总比猜测好:)
>>> dict([('hi','goodbye')])
{'hi': 'goodbye'}
或者:
>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ]
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}]
【讨论】:
如果你使用的是 python 2.7,那就更简洁了:
>>> t = ((1,'a'),(2,'b'))
>>> {y:x for x,y in t}
{'a':1, 'b':2}
【讨论】:
如果同一个键有多个值,下面的代码会将这些值附加到与其键对应的列表中,
d = dict()
for x,y in t:
if(d.has_key(y)):
d[y].append(x)
else:
d[y] = [x]
【讨论】:
这里有几种方法:
>>> t = ((1, 'a'), (2, 'b'))
>>> # using reversed function
>>> dict(reversed(i) for i in t)
{'a': 1, 'b': 2}
>>> # using slice operator
>>> dict(i[::-1] for i in t)
{'a': 1, 'b': 2}
【讨论】: