20

I have a list of tuples like this:

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

What is the fastest way in python (running on a very low cpu/ram machine) to swap values like this...

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

I am currently using:

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

Is there a better or faster way???

5 Answers 5

22

You could use map:

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

Or list comprehension:

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

List comprehensions are preferred and supposedly much faster than map when lambda is needed, however note that list comprehension has a strict evaluation, that is it will be evaluated as soon as it gets bound to variable, if you're worried about memory consumption use a generator instead:

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

There are some more details here: Python List Comprehension Vs. Map

Sign up to request clarification or add additional context in comments.

Comments

14

You can use reversed like this:

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

To apply it to a list, you can use map or a list/generator comprehension:

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

If you're interested primarily in runtime speed, I can only recommend that you profile the various approaches and pick the fastest.

Comments

5

A fancy way:

[t[::-1] for t in mylist]

Comments

3

Using a list comprehension I find more elegant and understandable to use separate variables instead of indices for a single variable as in the solution provided by @iabdalkader:

[(b, a) for a, b in mylist]

Comments

0

To modify the current list in-place, the most efficient way is:

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

It is assigning to the list slice, which covers the entire list, without creating an extra duplicate of the list in memory. See also this answer.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.