16

私はこのようなタプルのリストを持っています:

[('foo','bar'),('foo1','bar1'),('foofoo','barbar')]

このような値を交換するためのPython(非常に低いCPU / RAMマシンで実行)での最速の方法は何ですか...

[('bar','foo'),('bar1','foo1'),('barbar','foofoo')]

私は現在使用しています:

for x in mylist:
    self.my_new_list.append(((x[1]),(x[0])))

より良いまたはより速い方法はありますか?

4

5 に答える 5

19

マップを使用できます:

map (lambda t: (t[1], t[0]), mylist)

またはリスト内包表記:

[(t[1], t[0]) for t in mylist]

リスト内包表記が推奨され、ラムダが必要な場合はマップよりもはるかに高速であると考えられますが、リスト内包表記には厳密な評価があることに注意してください。つまり、変数にバインドされるとすぐに評価されます。メモリ消費が心配な場合は、代わりにジェネレーター:

g = ((t[1], t[0]) for t in mylist)
#call when you need a value
g.next()

ここにいくつかの詳細があります: Python List Comprehension Vs. 地図

于 2012-11-14T18:27:57.980 に答える
11

reversed次のように使用できます。

tuple(reversed((1, 2)) == (2, 1)

リストに適用するには、mapまたはリスト/ジェネレータ内包表記を使用できます。

map(tuple, map(reversed, tuples))     # map
[tuple(reversed(x)) for x in tuples]  # list comprehension
(tuple(reversed(x)) for x in tuples)  # generator comprehension

主に実行速度に関心がある場合は、さまざまなアプローチをプロファイルして最速のものを選択することをお勧めします。

于 2016-02-19T17:39:51.823 に答える
3

リスト内包表記を使用すると、@iabdalkader が提供するソリューションのように、単一の変数のインデックスではなく、個別の変数を使用する方がエレガントで理解しやすいことがわかります。

[(b, a) for a, b in mylist]
于 2019-03-08T11:26:11.483 に答える