Hướng dẫn python modify dictionary while iterating - python sửa đổi từ điển trong khi lặp lại

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ó:

  1. Sử dụng phương thức dict.copy[] để lặp lại một bản sao của từ điển.
  2. Trên mỗi lần lặp, kiểm tra nếu một điều kiện được đáp ứng.
  3. 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ó:

  1. 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.
  2. Sử dụng vòng lặp
    RuntimeError: dictionary changed size during iteration
    
    4 để lặp lại danh sách các khóa.
  3. 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.

Làm thế nào để bạn sửa đổi một từ điển trong Python trong khi lặp lại?

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ử DEL để 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.iterate over a copy of the dictionary and modify the items of the original dictionary. On each iteration, we check if the current value is equal to a specific string. If the condition is met, we can use the del operator to remove key-value pairs from the dictionary or add new key-value pairs.

Làm thế nào để bạn lặp lại thông qua các cặp giá trị chính trong Python?

Lặp lại trên cả hai khóa và giá trị ngay bây giờ trong trường hợp bạn cần lặp lại cả khóa và giá trị trong một lần, bạn có thể gọi các mục [].Phương thức sẽ trả về một tuple chứa các cặp giá trị khóa trong biểu mẫu [khóa, giá trị].call items[] . The method will return a tuple containing the key value pairs in the form [key, value] .

Làm thế nào để bạn lặp lại một đối tượng trong Python?

Bạn có thể tạo một đối tượng Iterator bằng cách triển khai chức năng tích hợp ITER cho một ITEBLEBLE.Một iterator có thể được sử dụng để lặp thủ công các mục trong Itable.Việc chuyển lặp đi lặp lại của trình lặp đến chức năng tiếp theo tích hợp trả về các mục liên tiếp trong luồng.create an iterator object by implementing the iter built-in function to an iterable. An iterator can be used to manually loop over the items in the iterable. The repeated passing of the iterator to the built-in next function returns successive items in the stream.

Làm cách nào để sao chép một từ điển trong Python?

Có một số cách để tạo các bản sao của từ điển ...
Sử dụng một vòng lặp.Một vòng lặp cho vòng lặp có thể được lặp lại để lặp lại thông qua từ điển gốc và sao chép các phần tử vào một từ điển mới, trống.....
Sử dụng Copy [] Đây là hàm Python tích hợp có thể được sử dụng để tạo một bản sao nông của từ điển.....
Sử dụng dict [].

Bài Viết Liên Quan

Chủ Đề