2013-09-05 57 views
27

là có cách nào để chuyển đổi một bộ pythonic thành một dict?Thiết lập để dict Python

tôi đã thiết lập sau đây

s = {1,2,4,5,6} 

và muốn dict sau

c = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0} 

với một danh sách bạn sẽ làm gì

a = [1,2,3,4,5,6] 
b = [] 

while len(b) < len(a): 
    b.append(0) 

c = dict(itertools.izip(a,b)) 
+0

Liên quan chặt chẽ: [Way Pythonic Hầu hết để xây dựng từ điển Từ Độc Danh sách] (http://stackoverflow.com/ q/14258984). –

+0

Và thay vì một vòng lặp 'while' chắp thêm' 0', tại sao không tạo ra 'b = [0] * len (a)'? Hoặc sử dụng 'itertools.izip (a, itertools.repeat (0))'. –

+0

Tôi muốn có một cách để sử dụng bản đồ và làm một số lambda! – shuva

Trả lời

50

Sử dụng dict.fromkeys():

c = dict.fromkeys(s, 0) 

Demo:

>>> s = {1,2,4,5,6} 
>>> dict.fromkeys(s, 0) 
{1: 0, 2: 0, 4: 0, 5: 0, 6: 0} 

này hoạt động cho các danh sách cũng; nó là phương pháp hiệu quả nhất để tạo một từ điển từ một chuỗi. Lưu ý tất cả các giá trị là tham chiếu đến một giá trị mặc định bạn đã chuyển vào dict.fromkeys(), vì vậy hãy cẩn thận khi giá trị mặc định đó là đối tượng có thể thay đổi.

11

Bên cạnh những phương pháp do @Martijn Pieters, bạn cũng có thể sử dụng một sự hiểu biết từ điển như thế này:

s = {1,2,4,5,6} 
d = {e:0 for e in s} 

Phương pháp này là chậm hơn so với dict.fromkeys(), nhưng nó cho phép bạn thiết lập các giá trị trong dict với bất cứ điều gì bạn cần, trong trường hợp bạn không muốn nó bằng không.

Bạn cũng có thể sử dụng nó để tạo danh sách, danh sách hiểu được nhanh hơn và nhiều hơn nữa pythonic rằng vòng lặp mà bạn có trong câu hỏi của bạn. Bạn có thể tìm hiểu thêm về comprehensions đây: http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

+2

Đây là phương pháp để sử dụng nếu giá trị mặc định là có thể thay đổi và bạn cần một đối tượng mới cho mỗi khóa. 'dict.fromkeys()' là * xa * nhanh hơn nếu không. –

+2

Xem [Hầu hết các cách Pythonic để xây dựng từ điển từ danh sách đơn] (http://stackoverflow.com/q/14258984) để so sánh. –

+0

True, comprehensions chậm hơn. – papirrin

4

Đây cũng là một cách khác để làm

s = {1,2,3,4,5} 
dict([ (elem, 0) for elem in s ])