Tôi có từ điển d1
và một danh sách l1
.Đọc từ điển Python rất chậm
Phím từ điển là chuỗi và các giá trị là Đối tượng tôi đã tự xác định. Nếu nó giúp, tôi có thể mô tả đối tượng chi tiết hơn nhưng bây giờ, các đối tượng có thuộc tính danh sách names
và một số thành phần của name
có thể hoặc không xuất hiện trong l1
.
Điều tôi muốn làm là vứt bỏ bất kỳ phần tử nào của từ điển d1
, trong đó thuộc tính name
của đối tượng trong phần tử đã nói không chứa bất kỳ phần tử nào xuất hiện trong l1
.
Như một ví dụ nhỏ:
l1 = ['cat', 'dog', 'mouse', 'horse', 'elephant',
'zebra', 'lion', 'snake', 'fly']
d1 = {'1':['dog', 'mouse', 'horse','orange', 'lemon'],
'2':['apple', 'pear','cat', 'mouse', 'horse'],
'3':['kiwi', 'lime','cat', 'dog', 'mouse'],
'4':['carrot','potato','cat', 'dog', 'horse'],
'5':['chair', 'table', 'knife']}
rất điển kết quả sẽ được nhiều hơn hoặc ít hơn như nhau nhưng các yếu tố của mỗi danh sách sẽ là cặp khóa-giá trị 1
-4
trừ trái cây và rau quả, và sẽ không chứa giá trị khóa-giá trị thứ 5 vì không có giá trị nội thất nào xuất hiện trong l1
.
Để làm điều này tôi đã sử dụng một danh sách lồng nhau/hiểu từ điển mà trông như thế này:
d2 = {k: [a for a in l1 if a in d1[k]] for k in d1.keys()}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'5': [],
'4': ['cat', 'dog', 'horse']}
d2 = {k: v for k,v in d2.iteritems() if len(v)>0}
print(d2)
>>>>{'1': ['dog', 'mouse', 'horse'],
'3': ['cat', 'dog', 'mouse'],
'2': ['cat', 'mouse', 'horse'],
'4': ['cat', 'dog', 'horse'],}
Điều này dường như làm việc, nhưng đối với các từ điển lớn, 7000+ mục, phải mất khoảng 20 giây để làm việc thông qua. Trong và của chính nó, không khủng khiếp, nhưng tôi cần phải làm điều này bên trong một vòng lặp sẽ lặp lại 10.000 lần, vì vậy hiện tại nó không khả thi. Bất kỳ đề xuất về cách làm điều này một cách nhanh chóng?
Lưu ý với mọi người: Anh đang sử dụng python 2.7 không 3 do sử dụng của 'itertitems', đừng để' in() 'đánh lừa bạn – jamylak
python 2.7 có khả năng đọc dict chưa? – Claudiu
@Claudiu Có họ đã được backported – jamylak