2012-04-30 44 views
10

Python dường như có sự không thống nhất về loại khóa sẽ chấp nhận đối với người dicts. Hoặc nói một cách khác, nó cho phép một số loại phím trong một cách để xác định dicts, nhưng không phải trong những người khác:python SyntaxError với dict (1 = ...), nhưng {1: ...} hoạt động

>>> d = {1:"one",2:2} 
>>> d[1] 
'one' 
>>> e = dict(1="one",2=2) 
    File "<stdin>", line 1 
    SyntaxError: keyword can't be an expression 

là các ký hiệu {...} cơ bản hơn, và dict(...) đường chỉ là cú pháp? Có phải vì đơn giản là không có cách nào cho Python là parse dict(1="one")?

tôi tò mò ...

Trả lời

17

Đây không phải là một vấn đề dict, nhưng một artifact của cú pháp Python: đối số từ khóa phải là bộ nhận diện hợp lệ, và 12 thì không.

Khi bạn muốn sử dụng bất kỳ thứ gì không phải là chuỗi theo quy tắc mã định danh Python làm khóa, hãy sử dụng cú pháp {}. Cú pháp đối số từ khóa của hàm tạo là chỉ để thuận tiện trong một số trường hợp đặc biệt.

9

dict là cuộc gọi hàm và từ khóa chức năng phải là số nhận dạng.

1

Nếu bạn đọc documentation, bạn sẽ biết rằng các ký hiệu dict = {stringA = 1, stringB = 2} là hợp lệ khi các phím là chuỗi đơn giản:

Khi các phím là chuỗi đơn giản, nó là đôi khi dễ dàng hơn để xác định cặp sử dụng đối số từ khóa :

>>> 
>>> dict(sape=4139, guido=4127, jack=4098) 
{'sape': 4139, 'jack': 4098, 'guido': 4127} 

Kể từ số nguyên (hoặc số khác) không phải là đối số từ khóa hợp lệ, dict = {1 = 2, 3 = 4} sẽ thất bại như bất kỳ cuộc gọi đến một hàm sẽ nếu bạn thông qua một cuộc tranh cãi với nó trong khi đặt tên nó với một số:

>>> def test(**kwargs): 
...  for arg in kwargs: 
...   print arg, kwargs[arg] 
... 
>>> test(a=2,b=3) 
a 2 
b 3 
>>> test(1=2, 3=4) 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 
1

Như câu trả lời khác đã nêu, dict là một lời gọi hàm. Nó có ba dạng cú pháp.

Hình thức:

dict(**kwargs) -> new dictionary initialized with the name=value pairs 
    in the keyword argument list. For example: dict(one=1, two=2) 

Các phím (hoặc name như được sử dụng trong trường hợp này) phải có giá trị Python identifiers, và ints không hợp lệ.

Hạn chế không chỉ là chức năng dict Bạn có thể chứng minh nó như vậy:

>>> def f(**kw): pass 
... 
>>> f(one=1) # this is OK 
>>> f(1=one) # this is not 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 

Tuy nhiên, có hai hình thức cú pháp khác của bạn có thể sử dụng.

Có:

dict(iterable) -> new dictionary initialized as if via: 
     d = {} 
     for k, v in iterable: 
      d[k] = v 

Ví dụ:

>>> dict([(1,'one'),(2,2)]) 
{1: 'one', 2: 2} 

Và từ một ánh xạ:

dict(mapping) -> new dictionary initialized from a mapping object's 
    (key, value) pairs 

Ví dụ:

>>> dict({1:'one',2:2}) 
{1: 'one', 2: 2} 
.210

Trong khi đó không có vẻ như nhiều (một dict từ một dict đen) ghi nhớ rằng Counterdefaultdict là ánh xạ và đây là cách bạn sẽ bí mật là một trong những để một dict:

>>> from collections import Counter 
>>> Counter('aaaaabbbcdeffff') 
Counter({'a': 5, 'f': 4, 'b': 3, 'c': 1, 'e': 1, 'd': 1}) 
>>> dict(Counter('aaaaabbbcdeffff')) 
{'a': 5, 'c': 1, 'b': 3, 'e': 1, 'd': 1, 'f': 4} 
Các vấn đề liên quan