2012-11-14 32 views
8

Tôi có một tuple/danh sách bên trong một danh sách như thế này:Trao đổi các giá trị trong một tuple/list bên trong một danh sách trong python?

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

gì là cách nhanh nhất trong python (chạy trên một CPU/máy ram rất thấp) để trao đổi các giá trị như thế này ...

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

curently sử dụng:

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

có cách nào tốt hơn hoặc nhanh hơn ???

Trả lời

7

Bạn có thể sử dụng bản đồ:

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

Hoặc danh sách hiểu:

Danh sách
[(t[1], t[0]) for t in mylist] 

comprehensions được ưa thích và được cho là nhanh hơn nhiều so với bản đồ khi lambda là cần thiết, tuy nhiên lưu ý rằng danh sách hiểu có một nghiêm ngặt đánh giá, đó là nó sẽ được đánh giá ngay sau khi nó bị ràng buộc với biến, nếu bạn lo lắng về mức tiêu thụ bộ nhớ, hãy sử dụng máy phát điện thay thế:

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

Có một số chi tiết ở đây: Python List Comprehension Vs. Map

+0

Điều này là tôi cần danh sách ngược cho một thành phần GUI enigma2, có nghĩa là tôi cần một danh sách đầy đủ (hơn 1000 tuples trong danh sách đó) đảo ngược. Danh sách hiểu là đúng cách sau đó? – subixonfire

+0

@ user1824571 có nhiều khả năng nhất – iabdalkader

5

Bạn có thể sử dụng reversed như thế này:

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

Để áp dụng nó vào một danh sách, bạn có thể sử dụng map hoặc một danh sách hiểu:

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

Nếu bạn quan tâm chủ yếu đến tốc độ thời gian chạy, tôi chỉ có thể đề xuất thứ mà bạn lập hồ sơ các cách tiếp cận khác nhau và chọn nhanh nhất.

Các vấn đề liên quan