Làm cách nào để khởi tạo một dict với các khóa từ danh sách và giá trị trống trong Python?


251

Tôi muốn nhận được từ điều này:

keys = [1,2,3]

đến đây:

{1: None, 2: None, 3: None}

Có một cách pythonic làm điều đó?

Đây là một cách xấu xí để làm điều đó:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

Câu trả lời:


389

dict.fromkeys([1, 2, 3, 4])

Đây thực sự là một classmethod, vì vậy nó cũng hoạt động cho các lớp con dict (như collections.defaultdict). Đối số thứ hai tùy chọn chỉ định giá trị sẽ sử dụng cho các khóa (mặc định là None.)


153
Cẩn thận với việc khởi tạo một cái gì đó có thể thay đổi: Nếu bạn gọi, ví dụ dict.fromkeys([1, 2, 3], []), tất cả các khóa được ánh xạ vào cùng một danh sách và sửa đổi một cái sẽ sửa đổi tất cả.
charleslparker

8
Khởi tạo với {k:[] for k in [1, 2, 3]}vẫn an toàn mặc dù.
Aziz Alto

263

không ai quan tâm để đưa ra một giải pháp hiểu chính tả?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
Tôi tin rằng nó đã được nhập vào 2.7
wim

21
Điều này là tốt và không gặp phải vấn đề tham khảo mà câu trả lời được chấp nhận.
charleslparker

Điều này cũng cho phép bạn gán một giá trị mặc định (ví dụ False).
neverendingqs

Đây là cách sạch nhất, Pythonic nhất trong Python3 IMO
Bede Constantinides

4
Sử dụng một dict-comp cũng cho phép giá trị là kết quả của việc gọi một hàm (có thể được truyền khóa dưới dạng đối số, nếu muốn) - vì vậy đây là một cơ chế rất mạnh.
martineau 04/07/2015

56
dict.fromkeys(keys, None)

2
tuyệt vời, tôi muốn danh sách trống,dict.fromkeys(keys, [])
muon

12
@muon Điều đó gần như chắc chắn không phải là những gì bạn muốn, xem bình luận charleslparker .
gerrit

Hoạt động trong phiên bản Python 2.6.6.
Mike Finch

2
Coi chừng: điều này sẽ khởi tạo dict với tất cả các khóa trỏ đến cùng một giá trị
Mendi Barel

16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

Đầu ra:

{'a': [], 'c': [], 'b': [], 'd': []}

1
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Francesco Menzani

4
tên keyDictnày gây hiểu nhầm, vì dòng mã đầu tiên trả về a set, không phải a dict.
Bryan Oakley

10
d = {}
for i in keys:
    d[i] = None

1
Tại sao Python ném ra một lỗi như : TypeError: 'type' object is not iterable?
FaCoffee

1
@FrancescoCastellani Vì listlà một loại. Trừ khi bạn có một cái gì đó như thế list = [], phương pháp trên sẽ luôn cung cấp cho bạn cùng một lỗi
smac89

1

Trong nhiều quy trình công việc mà bạn muốn đính kèm giá trị mặc định / ban đầu cho các khóa tùy ý, bạn không cần phải băm từng khóa riêng lẻ trước thời hạn. Bạn có thể sử dụng collections.defaultdict. Ví dụ:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

Điều này là hiệu quả hơn, nó tiết kiệm phải băm tất cả các khóa của bạn ngay lập tức. Hơn nữa, defaultdictlà một lớp con của dict, vì vậy thường không cần phải chuyển đổi trở lại từ điển thông thường.

Đối với quy trình công việc mà bạn yêu cầu điều khiển trên các khóa cho phép, bạn có thể sử dụng dict.fromkeystheo câu trả lời được chấp nhận:

d = dict.fromkeys([1, 2, 3, 4])
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.