2010-05-10 31 views
12

Tôi đang cố gắng để xây dựng một từ điển có chứa một loạt các bộ:Di chuyển phím nhất định từ một cuốn từ điển trong python

{Field1:{Value1, Value2, Value3}, Field2{Value4}} 

Vấn đề là, tôi thì muốn xóa bất kỳ lĩnh vực từ điển mà chỉ có một giá trị trong tập hợp. Tôi đã viết mã như thế này:

for field in FieldSet: 
    if len(FieldSet[field]) == 1: 
     del(FieldSet[field]) 

Nhưng nhận lỗi "RuntimeError: từ điển thay đổi kích thước trong khi thực thi". (Không ngạc nhiên, vì đó là những gì tôi đang làm.) Nó không phải là tất cả và tất cả nếu tôi phải gõ một số loại workaround, nhưng nó có thể làm điều này?

Trả lời

22

Thay thế giá trị trả lại từ .keys() thay thế. Vì bạn nhận được danh sách các phím, nó sẽ không bị ảnh hưởng bởi việc thay đổi từ điển sau khi bạn đã gọi nó.

+1

Tức là, thay dòng đầu tiên bằng điều này: 'cho trường trong FieldSet.keys():' – Smashery

+2

Tôi đang sử dụng python3, vì vậy dòng đã sửa là: cho trường trong danh sách (FieldSet.keys ()): – Margaret

+0

Không cần thiết phải chuyển đổi thành danh sách trong trường hợp này. – monkut

14

Một thay thế đôi khi-thích hợp hơn để thay đổi FieldSet tại chỗ đôi khi (tùy thuộc vào số lượng thay đổi thực hiện) để xây dựng một cái mới và gắn nó vào tên hiện:

FieldSet = dict((k, v) for k, v in FieldSet.iteritems() 
       if len(v) != 1) 
1

Có phương pháp pop . Nó loại bỏ các yếu tố mà một cuộc gọi quan trọng. Đối với ví dụ của bạn với điều này trông giống như:

for field in FieldSet.keys(): 
    if len(FieldSet[field]) == 1: 
     FieldSet.pop(field) 

Đây là trong python 3.2, nhưng tôi không chắc chắn nếu đó là một tính năng mới: http://docs.python.org/dev/library/stdtypes.html#dict.pop

Chỉ cần thử nó và nó hoạt động như quảng cáo.

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