con trăn để dict


149

Đối với bộ dữ liệu, t = ((1, 'a'),(2, 'b')) dict(t)trả về{1: 'a', 2: 'b'}

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

Cuối cùng, tôi muốn có thể trở lại 1được cho 'a'hoặc 2được cho 'b', có lẽ chuyển đổi sang một chế độ không phải là cách tốt nhất.

Câu trả lời:


277

Thử:

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

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

@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 cách đều thú vị như tiếp theo.
bjd2385

Tuyệt vời, nếu những gì bạn có là một bộ ba bạn có thể làm: dict((x, y) for x, y, z in t)hoặc dict((x, (y, z)) for x, y, z in t)để có được các giá trị thứ hai và thứ ba dưới dạng một tuple.
tham gia

Rất nhanh chóng, toàn diện và đơn giản. Câu trả lời hoàn hảo.
gies0r

73

Một phương pháp đơn giản hơn một chút:

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

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

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

1
Tôi thích điều này vì đã reverseđánh vần rõ ràng.
Frerich Raabe

4
@maazza: nói chung, các bài kiểm tra hiệu suất cho thấy rằng (ít nhất là trong triển khai C) mapnhanh hơn mức hiểu khi điều được ánh xạ là một hàm dựng sẵn khác (như reversed); trong hầu hết các trường hợp khác, điều ngược lại là đúng. Nhưng nó tốt hơn để hồ sơ hơn là đoán :)
Karl Knechtel

43

Thậm chí ngắn gọn hơ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}

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

Hoặc là:

>>> [ 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}]

Tôi không thấy câu trả lời này của OP
Luca Amerio

4

Nếu có nhiều giá trị cho cùng một khóa, đoạn mã sau sẽ nối các giá trị đó vào 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

Dưới đây là một số cách để làm điều đó:

>>> 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}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.