2010-09-24 39 views
98

Đối với các tuple, t = ((1, 'a'),(2, 'b')) dict(t) lợi nhuận {1: 'a', 2: 'b'}python tuple để dict

Có cách nào tốt để có được {'a': 1, 'b': 2} (phím và Vals hoán đổi)?

Tôi muốn có thể trả lại 1 từ 'a' hoặc 2 cho 'b' nhất định, có thể chuyển đổi thành dict không phải là cách tốt nhất.

Trả lời

183

Hãy thử:

>>> t = ((1, 'a'),(2, 'b')) 
>>> dict((y, x) for x, y in t) 
{'a': 1, 'b': 2} 
+3

+1 đẹp !, Tôi đã phải cố gắng nó với zip 'dict (zip (* zip (* t) [ :: - 1])) '. Đây là chậm hơn, xấu hơn và sử dụng nhiều bộ nhớ hơn .. có thể gấp 3 lần. – kevpie

+1

+1 Tuyệt vời !!! Đó là chính xác những gì tôi cần! :) –

+0

@ kevpie Điều tuyệt vời về Python là có hàng trăm cách để thể hiện cách làm một cái gì đó, mỗi thứ cũng thú vị như tiếp theo. – bjd2385

52

Một phương pháp tương đối đơn giản:

>>> t = ((1, 'a'),(2, 'b')) 
>>> dict(map(reversed, t)) 
{'a': 1, 'b': 2} 
+0

điều gì làm cho điều này nhanh hơn? – maazza

+2

Các chức năng bản đồ và dict được thực hiện trong C và nhanh hơn nhiều so với bất kỳ phiên bản python nào – jterrace

+0

Tôi thích điều này vì có 'đảo ngược' được viết một cách rõ ràng. –

5
>>> dict([('hi','goodbye')]) 
{'hi': 'goodbye'} 

Or: 

>>> [ dict([i]) for i in (('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14), ('CSCO', 21.14)) ] 
[{'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}, {'CSCO': 21.14}] 
34

Thậm chí nhiều hơn ngắn gọn nếu bạn đang ở trên python 2.7:

>>> t = ((1,'a'),(2,'b')) 
>>> {y:x for x,y in t} 
{'a':1, 'b':2} 
2

Nếu có nhiều giá trị cho cùng một khóa, mã sau sẽ nối thêm e giá trị cho danh sách tương ứng với khóa của chúng,

d = dict() 
for x,y in t: 
    if(d.has_key(y)): 
     d[y].append(x) 
    else: 
     d[y] = [x] 
-2

Tại sao bạn gặp khó khăn? bạn chỉ có thể nói:

t = ((1, 'a'),(2, 'b')) 
tdic = dict(t) 
+0

Đây là một câu trả lời sai cho câu hỏi 'Có cách nào tốt để có được {' a ': 1,' b ': 2} (khóa và vals đổi chỗ)?'. Trong câu trả lời của bạn, bạn có các phím là 1 và 2. Câu hỏi đặt ra là có các khóa là 'a' và 'b'. –

0

Dưới đây là cách vài làm việc đó:

>>> t = ((1, 'a'), (2, 'b')) 

>>> # using reversed function 
>>> dict(reversed(i) for i in t) 
{'a': 1, 'b': 2} 

>>> # using slice operator 
>>> dict(i[::-1] for i in t) 
{'a': 1, 'b': 2} 
Các vấn đề liên quan