Как работает использование двух переменных для l oop - PullRequest
0 голосов
/ 12 апреля 2020

Я начал читать документацию python. Я закончил с этим утверждением:

Код, который изменяет коллекцию, итерируя по той же коллекции, может быть сложно получить право. Вместо этого обычно проще просто l oop над копией коллекции или создать новую коллекцию:

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status

Я не могу понять решение. Как работает этот код? Я имею в виду, что у меня есть идея использовать одну переменную для итерации по списку, но использование двух сложно понять. Источник: https://docs.python.org/3/tutorial/controlflow.html#for - заявления

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

этот код перебирает пользователя и статус одновременно: если статус пользователя «неактивен», программа удалит этого пользователя за секунду для l oop, если пользователь «активен», он добавит этого пользователя в активный В пользовательском словаре, если вы хотите одновременно выполнить l oop через пару ключей и значений словаря, вы должны использовать метод dict.items (), а метод items () позволяет вам l oop через элементы каждого элемента словаря (или кортежа) одновременно, здесь элементы - пользователь и статус, поэтому есть также две итерационные переменные, также называемые пользователь и статус

0 голосов
/ 12 апреля 2020

Простой пример: представьте, что у вас есть физическая телефонная книга и вы хотите найти в ней друзей или семью. Эквивалент в Python будет выглядеть следующим образом:

phone_book = { "Mom": "123-456-7890", 
               "Dad": "123-456-7891",
               "John Doe": "555-555-5555", # and so on...
            }

Если вы пытаетесь найти номер телефона своего отца в своей физической телефонной книге, вы можете сделать это, перейдя непосредственно на страницу, которую вы написали. и найти запись. Точно так же поиск в словаре Python такой же:

print(phone_book['Dad']) # 123-456-7891

Теперь, когда пример из реального мира довольно ясен, посмотрите на свой пример. Через .items() вы получаете пару значений ключа, где user - это просто ключ для ссылки на указанное значение c в словаре users (например, «Мама» или «Папа»), а status - это значение сопоставляется с этим указанным c user (как и их номера телефонов).

Однако вы берете копию словаря users, чтобы вы могли выполнять итерацию по всей паре от users до statuses. Если бы у вас было

for user, status in users.items():
   del[user]

, вы бы изменили словарь, который вы пытаетесь повторить, и получили бы ошибку. Чтобы избежать этого, вы делаете его временную копию для повторения и удаления фактического user из users (подумайте «Удалить маму из вашей телефонной книги»).

Во втором фрагменте, вы добавляете людей в словарь активного пользователя. Подумайте «Добавить Билли в телефонную книгу с номером телефона« 111-222-3344 », но в этом случае вы добавляете user и их соответствующие status.

TLDR: словарь просто способ искать вещи, но чтобы что-то искать, вам нужно знать их идентификатор (name в телефонной книге, user в словаре пользователя). Если вы хотите что-то сделать со значением этого идентификатора (number в телефонной книге, status в пользовательском словаре), вы хотите временно сохранить его, пока не закончите.

...