Câu hỏi này hỏi về việc sử dụng một trình lặp [và đủ hài hước, rằng Python 2 .iteritems
iterator không còn được hỗ trợ trong Python 3] để xóa hoặc thêm các mục, và nó phải có câu trả lời không đúng như bạn có thể tìm thấy nó trong câu trả lời. Tuy nhiên: hầu hết những người tìm kiếm cố gắng tìm ra giải pháp, họ sẽ không quan tâm đến cách thức này được thực hiện về mặt kỹ thuật, có thể là người lặp hoặc đệ quy và có một giải pháp cho vấn đề:it must have a No as its only right answer as you can find it in the accepted answer. Yet: most of the searchers try to find a solution, they will not care how this is done technically, be it an iterator or a recursion, and there is a solution for the problem:
Bạn không thể thay đổi một dict mà không cần sử dụng chức năng bổ sung [đệ quy].
Do đó, câu hỏi này nên được liên kết với một câu hỏi có giải pháp làm việc:
Làm thế nào tôi có thể xóa một khóa: Giá trị cặp bất cứ nơi nào khóa được chọn xảy ra trong một từ điển được lồng sâu? [= "Xóa"]
Cũng hữu ích vì nó chỉ ra cách thay đổi các mục của một dict trên đường chạy: Làm thế nào tôi có thể thay thế một khóa: Giá trị cặp theo giá trị của nó bất cứ nơi nào khóa đã chọn xảy ra trong một từ điển được lồng sâu? [= "Thay thế"].
Bằng các phương thức đệ quy tương tự, bạn cũng sẽ có thể thêm các mục như câu hỏi cũng yêu cầu.
Vì yêu cầu của tôi để liên kết câu hỏi này đã bị từ chối, đây là bản sao của giải pháp có thể xóa các mục khỏi một dict. Xem Làm thế nào tôi có thể xóa một khóa: Giá trị cặp bất cứ nơi nào khóa được chọn xảy ra trong một từ điển được lồng sâu? [= "Xóa"] cho các ví dụ / tín dụng / ghi chú.
import copy
def find_remove[this_dict, target_key, bln_overwrite_dict=False]:
if not bln_overwrite_dict:
this_dict = copy.deepcopy[this_dict]
for key in this_dict:
# if the current value is a dict, dive into it
if isinstance[this_dict[key], dict]:
if target_key in this_dict[key]:
this_dict[key].pop[target_key]
this_dict[key] = find_remove[this_dict[key], target_key]
return this_dict
dict_nested_new = find_remove[nested_dict, "sub_key2a"]
Bí quyết
Bí quyết là tìm hiểu trước liệu Target_Key có nằm trong số những đứa trẻ tiếp theo [= this_dict [key] = các giá trị của lần lặp lại hiện tại] trước khi bạn đạt đến cấp độ trẻ. Chỉ sau đó bạn vẫn có thể xóa một khóa: Giá trị cặp của cấp độ trẻ em trong khi lặp lại trên một từ điển. Khi bạn đã đạt đến cấp độ tương tự với khóa bị xóa và sau đó cố gắng xóa nó từ đó, bạn sẽ gặp lỗi:
RuntimeError: dictionary changed size during iteration
Giải pháp đệ quy chỉ tạo ra bất kỳ thay đổi nào trên cấp phụ của các giá trị tiếp theo và do đó tránh được lỗi.
Sửa đổi một từ điển trong khi lặp lại nó trong Python #
Để sửa đổi một từ điển trong khi lặp lại nó:
- Sử dụng phương thức
dict.copy[]
để lặp lại một bản sao của từ điển. - Trên mỗi lần lặp, kiểm tra nếu một điều kiện được đáp ứng.
- Nếu điều kiện được đáp ứng, hãy sửa đổi từ điển.
Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } for key in my_dict.copy[]: if my_dict[key] == 'Python': del my_dict[key] my_dict['new_key'] = 'new_value' # 👇️ {'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'new_key': 'new_value'} print[my_dict]
Chúng tôi đã sử dụng phương thức dict.copy[]
để có được một bản sao của từ điển.
Phương thức Dict.Copy trả về một bản sao nông của đối tượng mà phương thức được gọi.
Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } # 👇️ {'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python'} print[my_dict.copy[]]
Điều này là cần thiết bởi vì chúng tôi không được phép sửa đổi từ điển trong khi lặp lại nó.
Tuy nhiên, chúng tôi có thể lặp lại một bản sao của từ điển và sửa đổi các mục của từ điển ban đầu.
Trên mỗi lần lặp, chúng tôi kiểm tra xem giá trị hiện tại có bằng một chuỗi cụ thể không.
Nếu điều kiện được đáp ứng, chúng ta có thể sử dụng toán tử
RuntimeError: dictionary changed size during iteration
1 để loại bỏ các cặp giá trị khóa khỏi từ điển hoặc thêm các cặp giá trị khóa mới.Chúng tôi cũng có thể lặp lại một bản sao của các mục từ điển.
Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } for key, value in my_dict.copy[].items[]: if value == 'Python': del my_dict[key] my_dict['new_key'] = 'new_value' # 👇️ {'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'new_key': 'new_value'} print[my_dict]
Phương thức Dict.Items trả về một chế độ xem mới về các mục của từ điển [[khóa, giá trị]].
Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } # 👇️ dict_items[[['first_name', 'bobby'], ['last_name', 'hadz'], ['site', 'bobbyhadz.com'], ['topic', 'Python']]] print[my_dict.items[]]
Ngoài ra, bạn có thể sử dụng lớp
RuntimeError: dictionary changed size during iteration
2.Sửa đổi một từ điển trong khi lặp lại nó bằng cách sử dụng danh sách [] #
Để sửa đổi một từ điển trong khi lặp lại nó:
- Sử dụng lớp
2 để chuyển đổi từ điển thành danh sách các khóa.RuntimeError: dictionary changed size during iteration
- Sử dụng vòng lặp
4 để lặp lại danh sách các khóa.RuntimeError: dictionary changed size during iteration
- Sửa đổi từ điển nếu một điều kiện nhất định được đáp ứng.
Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } for key in list[my_dict]: if my_dict[key] == 'Python': del my_dict[key] my_dict['new_key'] = 'new_value' # 👇️ {'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'new_key': 'new_value'} print[my_dict]
Chúng tôi đã sử dụng lớp
RuntimeError: dictionary changed size during iteration
2 để chuyển đổi từ điển thành danh sách các khóa.Copied!
my_dict = { 'first_name': 'bobby', 'last_name': 'hadz', 'site': 'bobbyhadz.com', 'topic': 'Python' } print[list[my_dict]] # 👉️ ['first_name', 'last_name', 'site', 'topic'] print[list[my_dict.keys[]]] # 👉️ ['first_name', 'last_name', 'site', 'topic']
Chúng tôi cũng có thể đã sử dụng phương pháp
RuntimeError: dictionary changed size during iteration
6 để rõ ràng hơn.Phương thức Dict.Keys trả về một cái nhìn mới về các khóa của từ điển.
Trên mỗi lần lặp, chúng tôi kiểm tra xem một điều kiện nhất định có được đáp ứng không và nếu có, chúng tôi sửa đổi từ điển.
Thay vì lặp lại từ điển, chúng tôi lặp lại danh sách các khóa.