2009-12-17 13 views
9

Tôi có một dự án chuyển đổi cơ sở dữ liệu này sang cơ sở dữ liệu khác. Một trong các cột cơ sở dữ liệu gốc xác định danh mục của hàng. Cột này sẽ được ánh xạ tới một danh mục mới trong cơ sở dữ liệu mới.Lập bản đồ nhiều đối một Python (tạo các lớp tương đương)

Ví dụ, chúng ta hãy giả định các loại ban đầu là: parrot, spam, cheese_shop, Cleese, Gilliam, Palin

Bây giờ đó là một chút verbose cho tôi, Và tôi muốn có những hàng này được phân loại như sketch, actor - Đó là, xác định tất cả các bản phác thảo và tất cả các diễn viên như hai lớp tương đương.

>>> monty={'parrot':'sketch', 'spam':'sketch', 'cheese_shop':'sketch', 
'Cleese':'actor', 'Gilliam':'actor', 'Palin':'actor'} 
>>> monty 
{'Gilliam': 'actor', 'Cleese': 'actor', 'parrot': 'sketch', 'spam': 'sketch', 
'Palin': 'actor', 'cheese_shop': 'sketch'} 

Đó là khá awkward- Tôi muốn có một cái gì đó như:

monty={ ('parrot','spam','cheese_shop'): 'sketch', 
     ('Cleese', 'Gilliam', 'Palin') : 'actors'} 

Nhưng điều này, tất nhiên, đặt toàn bộ tuple như một chìa khóa:

>>> monty['parrot'] 

Traceback (most recent call last): 
    File "<pyshell#29>", line 1, in <module> 
    monty['parrot'] 
KeyError: 'parrot' 

Bất kỳ ý tưởng làm thế nào để tạo một từ điển nhiều-một-một thanh lịch trong Python?

Cảm ơn,

Adam

+1

Kiểm tra [answer] câu trả lời thanh lịch này (http://stackoverflow.com/a/11105962/355230) cho một câu hỏi tương tự. – martineau

Trả lời

11

Dường như với tôi rằng bạn có hai mối quan tâm. Trước tiên, làm thế nào để bạn thể hiện bản đồ của bạn ban đầu, đó là, làm thế nào để bạn gõ ánh xạ vào tệp new_mapping.py của bạn. Thứ hai, cách ánh xạ hoạt động như thế nào trong quá trình ánh xạ lại. Không có lý do gì để hai đại diện này giống nhau.

Bắt đầu với việc lập bản đồ bạn thích:

monty = { 
    ('parrot','spam','cheese_shop'): 'sketch', 
    ('Cleese', 'Gilliam', 'Palin') : 'actors', 
} 

sau đó chuyển đổi nó thành các bản đồ bạn cần:

working_monty = {} 
for k, v in monty.items(): 
    for key in k: 
     working_monty[key] = v 

sản xuất:

{'Gilliam': 'actors', 'Cleese': 'actors', 'parrot': 'sketch', 'spam': 'sketch', 'Palin': 'actors', 'cheese_shop': 'sketch'} 

sau đó sử dụng working_monty để làm việc .

+1

+1 Cảm ơn rất nhiều. Tôi cho rằng không có kiểu gốc python nào cho công việc này; Bạn có nghĩ rằng nên có một? –

+0

chúng ta không thể có một số tham chiếu làm giá trị trong cặp (khóa, giá trị) thay vì lưu trữ chuỗi thực tế? Kể từ khi không. các khóa lớn hơn đáng kể so với số không. của các giá trị, điều này sẽ tiết kiệm rất nhiều không gian. Có cách nào để làm việc này không? – ishan3243

1
>>> monty={ ('parrot','spam','cheese_shop'): 'sketch', 
     ('Cleese', 'Gilliam', 'Palin') : 'actors'} 

>>> item=lambda x:[z for y,z in monty.items() if x in y][0] 
>>> 
>>> item("parrot") 
'sketch' 
>>> item("Cleese") 
'actors' 

Nhưng hãy để tôi nói với bạn, Nó sẽ chậm hơn bình thường 1-1 từ điển.

+0

Slow-ish, nhưng ở bên cộng không yêu cầu cấu trúc dữ liệu thứ cấp liên tục. Có thể được tăng tốc lên một mức độ nhất định bằng cách không được viết như một lambda và sử dụng một danh sách hiểu. – martineau

4

Bạn có thể ghi đè lên indexer dict, nhưng có lẽ là giải pháp đơn giản sau đây sẽ tốt hơn: (. Có lẽ lồng nhau cho vòng lặp có thể được nén một ấn tượng một lót, nhưng hoạt động này và có thể đọc được)

>>> assoc_list = ((('parrot','spam','cheese_shop'), 'sketch'), (('Cleese', 'Gilliam', 'Palin'), 'actors')) 
>>> equiv_dict = dict() 
>>> for keys, value in assoc_list: 
    for key in keys: 
     equiv_dict[key] = value 


>>> equiv_dict['parrot'] 
'sketch' 
>>> equiv_dict['spam'] 
'sketch' 

+1

Không dành cho người yếu tim: equiv_dict = dict (tổng ([[(k, v) cho k theo ks] cho (ks, v) trong assoc_list], [])) –

0

Nếu bạn muốn có nhiều phím trỏ đến cùng giá trị, ví dụ:

m_dictionary{('k1', 'k2', 'k3', 'k4'):1, ('k5', 'k6'):2} và truy cập chúng như,

`print(m_dictionary['k1'])` ==> `1`. 

Kiểm tra từ điển đa này python mô-đun multi_key_dict. Cài đặt và nhập nó. https://pypi.python.org/pypi/multi_key_dict

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