在 for 循环中使用两个变量如何工作

How does using two variables in for loop work

我开始阅读 python 文档。我结束了这个声明:

Code that modifies a collection while iterating over that same collection can be tricky to get right. Instead, it is usually more straight-forward to loop over a copy of the collection or to create a new collection:

# 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-statements

此代码同时遍历用户和状态:如果用户状态为 'inactive' 程序将删除此用户 在第二个for循环中,如果用户是'active',它将把这个用户添加到active-users字典中,当你想同时遍历字典的键值对时,你必须使用dict.items() 方法,items() 方法允许您同时循环遍历每个字典元素(或元组)的项目,这里的项目是用户和状态,这就是为什么还有 2 个迭代变量也被命名用户和状态

简单示例:假设您有一本 phone 实体书,想在其中查找朋友或家人。 Python 中的等价物是:

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

如果你想在你的 phone 实体书中查找你父亲的 phone 号码,你可以直接导航到你写它的页面并找到条目来实现.同样,在 Python 字典中查找也是一样的:

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

现在现实世界的例子已经很清楚了,看看你的例子。通过 .items(),您将检索键值对,其中 user 只是引用 users 字典中特定值的键(如 "Mom" 或 "Dad") 和 status 是映射到特定 user 的值(就像它们的 phone 数字)。

但是,您正在获取 users 字典的副本,以便您可以遍历 usersstatuses 的整个配对。如果你有

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

你会修改你试图迭代的字典,并且会得到一个错误。为避免这种情况,您正在制作它的临时副本以迭代并从 users 中删除实际的 user(想想 "Remove Mom from your phone book")。

在第二块中,您要将人员添加到活跃用户词典中。想想 "Add Billy to phone book with phone number of "111-222-3344",但在这种情况下,您要添加 user 及其对应的 status.

TLDR:字典只是查找事物的一种方式,但为了查找事物,您需要知道它们的标识符(name 在 phone 书中,user 在用户字典中)。如果您想使用该标识符的值(phone 书中的 number,用户字典中的 status)执行某些操作,您需要暂时存储它,直到您完成它。

我也有同样的困惑。给出的示例不起作用。缺少的部分是开头的字典对象 'users'。在教程的那一点上,我们还没有被教导过它们。 https://docs.python.org/3/library/stdtypes.html#index-50

工作版本是

users = { "John": "inactive", 
               "Helen": "active",
               "James": "active", # and so on...
            }

# 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

如果你想看内容可以打印出来。试试这个:

users = { "John": "inactive", 
               "Helen": "active",
               "James": "active", # and so on...
            }

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

print("Users after deleting.")
for user, status in users.items():
    print(user, status)

users = { "John": "inactive", 
               "Helen": "active",
               "James": "active", # and so on...
            }

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

print("active_users.items")
for user, status in active_users.items():
    print(user, status)