从元组列表中映射值到另一个列表

3

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

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

预期结果:

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

感谢您的帮助。
4个回答

7

试试这个:

map(dict(bar).get, foo)

3
dict(bar).get 的计算结果是一个绑定方法,因此字典只会被创建一次。 - chepner
谢谢,这很棒。是否可以更改未找到键的默认值“none”? - JAB
@JBradley 如果你想这样做,这个解决方案就会失去它的优雅。你可以使用一个 lambda,例如 map(lambda k: dict(bar).get(k, VAL), foo)map 中。 - jamylak
@jamylak 哎呀,这太奇怪了。我想知道为什么会发出那个调用。那就不要理会它了。 - Gareth Latty
如果你想要一个与None不同的默认值,可以尝试这样做:map(defaultdict(lambda: 'nothing', bar).__getitem__, foo) - John Zwinck
显示剩余4条评论

1
非常简短的版本:
[ dict(bar)[i] for i in foo ]

在开始时只需执行一次dict(bar)

1
另一种使用 itemgetter 的替代方法:
>>> foo = ['a','b','c']
>>> bar = [('a','1'),('b','2'),('c','3')]
>>> from operator import itemgetter
>>> itemgetter(*foo)(dict(bar))
('1', '2', '3')

这会返回一个元组,但如果确实需要,转换起来也很容易。请注意,如果元组可接受且每次重复使用相同的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位版本


有趣的结果,希望能看到foo*1000或者其他大的内容。而且在我看来,这是一种不公平的模式,因为你事先不应该知道foo - jamylak
@jamylak -- 我不知道OP是否事先知道它。但是有时候你可能事先知道你想要的键,就我所见,我的方法是唯一真正能够充分利用这一点的方法。但是,对于找不到的项进行操作会变得有点混乱(我需要一个defaultdict(lambda: default))。 - mgilson
1
为什么每个人都拼错我的名字? - John Zwinck
@JohnZwinck -- 我最真诚地道歉。我已经在上方进行了更正(希望如此)。 - mgilson

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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接