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]

当需要 lambda 时,列表推导是首选并且据说比 map 快得多,但是请注意,列表推导具有严格的评估,也就是说,如果您担心内存消耗,它将在绑定到变量时立即评估生成器代替:

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 回答
2

一种奇特的方式:

[t[::-1] for t in mylist]
于 2018-08-08T20:59:08.453 回答
0

要就地修改当前列表,最有效的方法是:

my_list[:] = [(y, x)  for x, y in my_list]

它分配给覆盖整个列表的列表切片,而不在内存中创建列表的额外副本。另请参阅此答案

于 2021-01-04T16:40:09.670 回答