2010-08-20 27 views
7

Tôi đang cố gắng để tạo ra một cái gì đó như sau:Python từ điển tham chiếu đến hàng xóm yếu tố điển

dictionary = { 
    'key1': ['val1','val2'], 
    'key2': @key1 
} 

nơi @ key1 là tài liệu tham khảo vào từ điển [ 'key1']. Cảm ơn bạn trước.

+2

điều gì sẽ xảy ra nếu bạn làm điều gì đó như 'dictionary ['key1'] = 4'? Nếu khóa 2 có chứa 4 hay nó vẫn tham chiếu danh sách gốc? –

+0

Tương tự như câu hỏi này, mặc dù nó đã được đăng sau: [Tôi phải làm gì khi cần một từ điển tự tham khảo?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-self-referential-dictionary) –

Trả lời

4

Tôi muốn mở rộng phiên bản Aaron Digulla. Những gì ông hiện đã được sao chép ở đây:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

tôi giả sử ông muốn tái tạo ngữ nghĩa tham khảo đúng, để truy cập vào 'key2' sẽ luôn luôn cung cấp cho bạn một cách để có được bất cứ điều gì 'key1' đã là một giá trị. vấn đề là trong khi d['key1']list, d['key2']DictRef. Vì vậy, để có được "giá trị" của 'key1' tất cả những gì bạn cần làm là d['key1'], nhưng đối với 'key2' bạn phải làm d[d['key2'].key]. Hơn nữa, bạn không thể có tham chiếu đến tham chiếu hoạt động một cách an toàn, nó sẽ trở thành d[d[d['key2'].key].key]. Và làm thế nào để bạn phân biệt giữa một tham chiếu và một giá trị thông thường? Có lẽ thông qua việc đánh máy với việc khôi phục (v, DictReference) (ew).

Vì vậy, tôi có đề xuất sửa tất cả những điều này.

Cá nhân, tôi không hiểu tại sao ngữ nghĩa tham khảo thực sự là cần thiết. Nếu chúng xuất hiện cần thiết, chúng có thể được thực hiện không cần thiết bằng cách tái cấu trúc vấn đề, hoặc giải pháp cho vấn đề. Nó thậm chí có thể là họ không bao giờ cần thiết, và một đơn giản d.update(key2=d['key1']) sẽ giải quyết được vấn đề.

Dù sao, để đề nghị:

class DictRef(object): 
    def __init__(self, d, key): 
     self.d = d 
     self.key = key 

    def value(self): 
     return self.d[self.key].value() 

class DictVal(object): 
    def __init__(self, value): 
     self._value = value 

    def value(self): 
     return self._value 

d = {} 
d.update(
    key1=DictVal(['val1', 'val2']), 
    key2=DictRef(d, 'key1') 
) 

Bây giờ, để có được giá trị của bất kỳ quan trọng, cho dù đó là một tham chiếu hay không, người ta sẽ chỉ đơn giản là làm d[k].value(). Nếu có tham chiếu đến tham chiếu, chúng sẽ bị hủy tham chiếu trong chuỗi chính xác. Nếu chúng tạo thành một chuỗi dài hoặc vô hạn, Python sẽ thất bại với một RuntimeError để đệ quy quá mức.

4

Sử dụng một lớp mới:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

Lưu ý cú pháp kỳ lạ bởi vì bạn không có cách nào để biết bên trong đó điển bạn đang tạo DictRef.

+3

Vâng, vì nó không thể làm điều đó mà không tham khảo d anyway, chúng tôi cũng có thể làm 'd = {'key1': [...]}; d.update ({'key2': d ['key2']}) '. – delnan

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