2

我想使用元组列表中的值替换列表(foo)中的值。每个元组中的第一个值是映射到第一个列表中的值的字段。列表栏中每个元组中的第二个值是我要在列表 foo 中替换的值。

foo = ['a','b','c']
bar = [('a','1'),('b','2'),('c','3')]

预期成绩:

result = ['1','2','3']

谢谢你的帮助

4

4 回答 4

5

尝试这个:

map(dict(bar).get, foo)
于 2013-05-08T12:53:12.987 回答
1

另一种使用方法itemgetter

>>> foo = ['a','b','c']
>>> bar = [('a','1'),('b','2'),('c','3')]
>>> from operator import itemgetter
>>> itemgetter(*foo)(dict(bar))
('1', '2', '3')

这给出了 a tuple,但如果确实需要,这很容易转换。请注意,如果元组是可接受的并且您每次都重新使用相同的 getter,那么这将是一种非常有效的方法:

>>> def mgilson():
...     return itemgetter(*foo)(dict(bar))
... 
>>> def zwinck():
...     return map(dict(bar).get,foo)
... 
>>> def alfe():
...     b = dict(bar)
...     return [b[i] for i in foo]
... 
>>> import timeit
>>> timeit.timeit('mgilson()','from __main__ import mgilson')
1.306307077407837
>>> timeit.timeit('zwinck()','from __main__ import zwinck')
1.6275198459625244
>>> timeit.timeit('alfe()','from __main__ import alfe')
1.2801191806793213
>>> def mgilson_mod(getter=itemgetter(*foo)):
...      return getter(dict(bar))
... 
>>> timeit.timeit('mgilson_mod()','from __main__ import mgilson_mod')
1.1312751770019531

在 Ubuntu Linux 上使用 python2.7.3 64 位完成的测试

于 2013-05-08T12:56:59.230 回答
1

考虑到有些物品foo可能不需要更换

例如。

>>> foo = ['a','b','c', 'd']
>>> bar = [('a','1'),('b','2'),('c','3')]
>>> d = dict(bar)
>>> [d.get(x, x) for x in foo]
['1', '2', '3', 'd']
于 2013-05-08T13:00:13.247 回答
0

非常简短的版本:

[ dict(bar)[i] for i in foo ]

考虑dict(bar)在开始时只做一次。

于 2013-05-08T12:52:58.967 回答