2012-06-17 32 views
12

dữ liệu:Thay đổi khung dữ liệu từ Counter để dict khung

pair = collections.defaultdict(collections.Counter) 

ví dụ

pair = {'doc1': {'word1':4, 'word2':3}, 
     'doc2': {'word1':2, 'word3':4}, 
     'doc3': {'word2':2, 'word4':1}, 
     ...} 

tôi muốn giữ khung dữ liệu nhưng thay đổi kiểu của phần này {'word1':4, 'word2':3}{'word1':2, 'word3':4}``... Nó bây giờ là một Counter và tôi cần một dict.

tôi đã cố gắng này để lấy dữ liệu từ pair, nhưng tôi không biết làm thế nào để tạo ra một dict cho từng tài liệu:

new_pair = collections.defaultdict(collections.Counter) 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

Tôi không muốn thay đổi sản lượng. Tôi chỉ cần trong mỗi tài liệu, loại dữ liệu là dict, không phải Counter.

+1

Đăng theo dõi thực tế và ngữ cảnh khác. – agf

+0

WHO nói 'đối số đầu tiên phải được gọi'? – joaquin

+0

bạn muốn gì? Bạn có thể cung cấp cho đầu ra mà bạn muốn? – shihongzhi

Trả lời

20

A Counter đã là dict - hoặc, một phân lớp của nó. Tuy nhiên, nếu bạn thực sự cần chính xác một dict đối với một số lý do, sau đó nó một lớp lót:

>>> c = Counter(word1=4, word2=3) 
>>> c 
Counter({'word1': 4, 'word2': 3}) 
>>> dict(c) 
{'word1': 4, 'word2': 3} 

Bất kỳ Mapping (bất cứ điều gì mà cư xử như một cuốn từ điển) có thể được thông qua vào dict, và bạn sẽ nhận được một dict với cùng nội dung. Không cần phải lặp lại nó để tự xây dựng nó.

Điều này cung cấp cho bạn một vòng lặp, với một dòng trong phần thân thay vì vòng lặp lồng nhau. Nhưng bất kỳ mã nào của biểu mẫu:

thing = a new empty collection 
for elem in old_thing: 
    Add something to do with elem to thing 

Thường có thể được thực hiện bằng một biểu thức máy phát hoặc danh sách, đặt hoặc đọc hiểu. Chúng tôi đang xây dựng một dict, do đó, có thể có một số dict comprehension (phần Ví dụ là điều bạn quan tâm nhất). Tôi sẽ để lại với nó như là một bài tập cho người đọc. ;-)

+1

+1 Vì chức năng của một 'Counter' là cần thiết, nó chỉ có thể được chuyển đổi thành' dict' sau đó vì vậy đây là cách duy nhất để thực hiện nó. – jamylak

+1

@jamylak kk. cảm ơn. – juju

0

Có lẽ bạn đang tìm kiếm:

>>> from collections import defaultdict 
>>> pair = defaultdict(dict) 
>>> pair[3][2]='hello' 
>>> 
>>> pair 
defaultdict(<type 'dict'>, {3: {2: 'hello'}}) 
>>> 
>>> pair[3] 
{2: 'hello'} 
>>> 
+0

Không phải «dd (dict)' hoạt động thay vì 'dd (lambda: dict())'? – DSM

+0

@ DSM, vâng, rõ ràng là lỗi của tôi. – joaquin

0
new_pair = {} # simple dict at the top level 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     # top-level values is word counters 
     new_pair[doc].setdefault(word, Counter()) += freq 
0

Các Counter cũng là một dict. Nhưng phụ thuộc vào nhu cầu của bạn, có thể mã sau là bạn muốn.

new_pair ={} 
for doc, tab in pari.items(): 
    new_pair[doc] = {} 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

new_pair dict là bạn muốn. Chúc may mắn!

Các vấn đề liên quan