2012-02-28 21 views
13

Tôi có một danh sách các giá trị như:Python: làm thế nào để xây dựng một dict từ danh sách đơn giản của các phím và đánh giá cao

["a", 1, "b", 2, "c", 3] 

và tôi muốn xây dựng một dict như vậy từ nó:

{"a": 1, "b": 2, "c": 3} 

Cách tự nhiên để thực hiện điều đó bằng Python là gì?

+3

Làm cách nào bạn nhận được danh sách này ngay từ đầu? Vòng lặp tạo danh sách đó ** nên ** được cố định để tạo từ điển trực tiếp. –

+0

@ S.Lott: Danh sách là kết quả của re.findall gọi – izhak

+1

Vui lòng ** cập nhật ** câu hỏi với thông tin quan trọng đó. Nó có thể giúp đỡ để được ban đầu RE, cũng có, vì có thể có cách để đơn giản hóa việc xử lý của bạn. –

Trả lời

35
>>> x = ["a", 1, "b", 2, "c", 3] 
>>> i = iter(x) 
>>> dict(zip(i, i)) 
{'a': 1, 'c': 3, 'b': 2} 
+1

+1: Sử dụng 'loop' tốt để thay thế các phần tử –

+4

Giả sử đối số' zip' sẽ phân tích đầu tiên có vẻ sai với tôi bằng cách nào đó ... – cha0site

+4

@ cha0site Thứ tự đánh giá từ trái sang phải của vòng lặp được đảm bảo. –

13

Điều này có vẻ khá succint, nhưng tôi sẽ không gọi nó rất tự nhiên:

>>> l = ["a", 1, "b", 2, "c", 3] 
>>> dict(zip(l[::2], l[1::2])) 
{'a': 1, 'c': 3, 'b': 2} 
0

Tôi không thực sự nhìn thấy nhiều tình huống mà bạn sẽ chạy vào vấn đề này chính xác, vì vậy không có 'tự nhiên' dung dịch. Một cách nhanh chóng lót mà nên làm các trick cho bạn sẽ là tuy nhiên:

{input_list[2*i]:input_list[2*i+1] for i in range(len(input_list)//2)} 
+0

Tôi nghi ngờ rằng điều này sẽ làm việc. Cũng không sử dụng tên dựng sẵn ('đầu vào') cho các biến. Trong Python 2.7 nó chỉ đơn giản là thất bại trên cho và trong Python 3 nó than khóc về các đối số cho phạm vi đang nổi. – Nobody

+0

Tại sao điều này không hoạt động? – Bogdan

+0

Đã thử trong python 2.7.1 trước khi đăng. Bạn không chắc chắn cách nó dịch sang các phiên bản khác. – Bogdan

3

Bạn có thể zip danh sách các yếu tố thay thế như vậy

>>> lst = ["a", 1, "b", 2, "c", 3] 
>>> dict(zip(lst[::2], lst[1::2]) 
{'a': 1, 'c': 3, 'b': 2} 
1

Một cách khác:

>>> l = ["a", 1, "b", 2, "c", 3] 
>>> dict([l[i:i+2] for i in range(0,len(l),2)]) 
{'a': 1, 'c': 3, 'b': 2} 
Các vấn đề liên quan