2

タプルのリストの値を使用して、リスト (foo) の値を置き換えたいと思います。各タプルの最初の値は、最初のリストの値にマップするフィールドです。リスト バーの各タプルの 2 番目の値は、リスト foo で置き換えたい値です。

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

予想された結果:

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

助けてくれてありがとう

4

4 に答える 4

1

を使用する別の代替手段itemgetter

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

これにより が得られますがtuple、実際に必要な場合は簡単に変換できます。タプルが受け入れられ、毎回同じゲッターを再利用している場合、これは非常に効率的な方法であることがわかります。

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

python2.7.3 64 ビットを使用して Ubuntu Linux で実行されたテスト

于 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 に答える