2011-09-01 7 views
21

Tôi biết về việc hiểu danh sách, những gì về sự hiểu biết từ điển?Có sự hiểu biết từ điển trong Python không? (Vấn đề với chức năng trả về dict)

Output dự kiến:

>>> countChar('google') 
    {'e': 1, 'g': 2, 'l': 1, 'o': 2} 
    >>> countLetters('apple') 
    {'a': 1, 'e': 1, 'l': 1, 'p': 2} 
    >>> countLetters('') 
    {} 

Mã (Tôi là một người mới bắt đầu):

def countChar(word): 
    l = [] 
    #get a list from word 
    for c in word: l.append(c) 
    sortedList = sorted(l) 
    uniqueSet = set(sortedList) 
    return {item:word.count(item) for item in uniqueSet } 

vấn đề với mã này là gì? Tại sao tôi nhận được SyntaxError này?

return { item:word.count(item) for item in uniqueSet } 
^ 
SyntaxError: invalid syntax 
+1

lỗi cú pháp là thêm ')': 'word.count (item))' –

+1

corrected.but vẫn có vấn đề – newbie

+0

Can y ou dán lỗi thực tế bạn đang nhận được? – SingleNegationElimination

Trả lời

29

chỉnh sửa: Như AGF chỉ ra trong ý kiến ​​và câu trả lời khác, có một sự hiểu biết từ điển cho Python 2.7 hoặc mới hơn.

def countChar(word): 
    return dict((item, word.count(item)) for item in set(word)) 

>>> countChar('google') 
{'e': 1, 'g': 2, 'o': 2, 'l': 1} 
>>> countChar('apple') 
{'a': 1, 'p': 2, 'e': 1, 'l': 1} 

Không cần để chuyển đổi word vào một danh sách hoặc sắp xếp nó trước khi biến nó thành một bộ từ chuỗi là iterable:

>>> set('google') 
set(['e', 'o', 'g', 'l']) 

Không có hiểu từ điển với cho Python 2.6 và dưới đây, đó có thể là lý do tại sao bạn thấy lỗi cú pháp. Cách khác là tạo danh sách các bộ giá trị khóa bằng cách sử dụng một trình hiểu hoặc máy phát và chuyển nó vào trong tích hợp dict().

+0

mã của bạn, nó quá ngắn, nó hoạt động, nhưng tôi là người mới bắt đầu, có các cách khác cho người mới bắt đầu. – newbie

+1

@newbie - Tôi đã chuyển từ 'lambda' sang định nghĩa hàm bình thường, tôi sẽ thêm một số giải thích bổ sung. –

+0

Cảm ơn bạn đã giải thích. – newbie

60

Nếu bạn đang ở trên Python 2.7 hoặc mới hơn:

{item: word.count(item) for item in set(word)} 

hoạt động tốt. Bạn không cần phải sắp xếp danh sách trước khi bạn đặt nó. Bạn cũng không cần phải biến từ đó thành danh sách. Ngoài ra, bạn đang sử dụng một Python đủ mới để sử dụng collections.Counter(word) để thay thế.

Nếu bạn đang ở trên một phiên bản cũ của Python, bạn không thể sử dụng dict comprehensions, bạn cần phải sử dụng một biểu thức máy phát điện với các nhà xây dựng dict:

dict((item, word.count(item)) for item in set(word)) 

này vẫn đòi hỏi bạn phải lặp qua wordlen(set(word)) lần, vì vậy hãy thử một cái gì đó như:

from collections import defaultdict 
def Counter(iterable): 
    frequencies = defaultdict(int) 
    for item in iterable: 
     frequencies[item] += 1 
    return frequencies 
+5

Cú pháp của Python luôn khiến tôi cảm thấy như tôi ' m gian lận. Tại sao các ngôn ngữ khác không đơn giản? – ArtOfWarfare