【问题标题】:Loop to create a new collection循环创建一个新集合
【发布时间】:2021-08-11 17:51:41
【问题描述】:

我正在阅读 Python 的官方教程,在循环部分中,它提出了两种更改字典的策略(作为新手,我发现这很棘手,因为我有时会为这类事情获取索引超出范围的错误) . 1. 创建一个副本,以及 2. 创建一个新集合。

以下是Python官网提供的代码(用户列表由我添加)。

def try_loop_iterate_copy():

    users = {'amy': 'inactive', 'lily': 'active', 'poppy': 'active'}
    #Strategy:  Iterate over a copy
    for user, status in users.copy().items():
        if status == 'inactive':
            del users[user]
    print(users)

结果:

{'lily': 'active', 'poppy': 'active'}
def try_loop_new_collection():

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

结果:

{'lily': 'active', 'poppy': 'active'}

我得到了相同的结果,但是我无法理解为什么active_users[user] = status 会以它的方式工作。为什么将状态分配给active_users[user],并设法在新列表中获取活动用户的完整列表及其状态?我很感激新手的解释。

【问题讨论】:

  • “更改列表”?还是“改变字典”?还有什么你不知道active_users[user] = status 是如何工作的?这类似于将项目花费到列表中。就在这种情况下,它会追加/值
  • 你能详细说明你没有得到的部分吗?
  • 执行此操作的更简单(且更“Pythonic”IMO)的方法是:users = {user: status for user, status in users.items() if status != 'inactive'}
  • 这真是太好了,谢谢 Samwise!

标签: python dictionary iteration


【解决方案1】:

第一个在迭代期间更改字典大小,因此需要在副本上进行迭代。

第二个填充(修改也可以)一个它没有迭代的字典。

经验法则是:如果您对序列/可变映射进行迭代,不要在迭代期间修改它的大小

【讨论】:

    【解决方案2】:
    active_users[user] = status
    

    此行使用键 user 更新 dict 条目。如果条目存在(不是您的情况),它会用新值覆盖旧值,就像任何变量一样。由于该键在字典中存在,因此这一行添加了一个新条目,键为user,值为status

    一次一个条目,该循环将信息从旧字典复制到新字典。

    尝试在代码中添加几个有用的print 语句,然后观察它的工作情况:

    users = {'amy': 'inactive', 'lily': 'active', 'poppy': 'active'}
    # Strategy:  Create a new collection
    active_users = {}
    for user, status in users.items():
        print('\n', user, status)
        if status == 'active':
            active_users[user] = status
        print(active_users)
    

    结果:

     amy inactive
    {}
    
     lily active
    {'lily': 'active'}
    
     poppy active
    {'lily': 'active', 'poppy': 'active'}
    

    【讨论】:

    • 您的回答非常有帮助,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多