【问题标题】:Best way to loop through multiple dictionaries in Python在 Python 中遍历多个字典的最佳方法
【发布时间】:2017-08-04 12:30:07
【问题描述】:

我移动字典

user = {
    'name': 'Bob',
    'age': '11',
    'place': 'moon',
    'dob': '12/12/12'
}

user1 = {
    'name': 'John',
    'age': '13',
    'place': 'Earth',
    'dob': '12/12/12'
}

通过加 1 循环遍历每个用户的最佳方法是什么?所以下一个用户是 user2。

谢谢

【问题讨论】:

  • 当你开始给变量编号时,你做错了。请使用列表。这可以说是遍历任何东西的“最佳方式”。
  • 非常感谢!工作很棒

标签: python loops


【解决方案1】:

您可以创建一个新的字典变量,其中键是用户,值是嵌套字典,其中包含有关用户的所有信息,而不是将 user1 指定为字典的变量名,如下所示:

users = {
    'user1': {
         'name': 'John',
         'age': '13',
         'place': 'Earth',
         'dob': '12/12/12'
         },
    'user2': {
         'name': 'Bob',
         'age': '11',
         'place': 'moon',
         'dob': '12/12/12'
         }
     ...}

然后您可以遍历所有用户 user1、user2、...userN 的嵌套字典,而不是将每个用户分配给自己的变量。

更新: 下面是你如何遍历嵌套字典:

for k, v in users.items():
    print(k, v)

其中 k 是键('user1'、'user2' 等),v 是包含用户信息的嵌套字典。

【讨论】:

  • 你提供了正确的答案 - 但你忘记循环了 - 即使它看起来很愚蠢,你应该添加一个如何循环到你的 dict 以真正回答 OP 的示例
  • 感谢您的帮助 - 我决定采用您的解决方案。 @Arount 没关系,我做到了。
  • @smye 它也适用于未来的用户,并向这个新伙伴“教”什么 SO 期望是一个好的答案 - 无论如何,你的答案很好:) +1
【解决方案2】:

处理这个问题的最简单方法(在我看来是将字典放在一个列表中。 如果键实际上意味着什么,我只会使用字典。以下也是转换为 json 的有效字典。

users = [{
             'name': 'John',
             'age': '13',
             'place': 'Earth',
             'dob': '12/12/12'
             },
            {
             'name': 'Bob',
             'age': '11',
             'place': 'moon',
             'dob': '12/12/12'
             }]

user1 是 users[0],user2 是 users[1] ...

users.append({...}) 添加更多等。

如果你循环并想要用户号:

for ind,item in enumerate(users):
    print("user{}".format(ind+1))

打印:

user1
user2

【讨论】:

    【解决方案3】:

    zip() 是迭代多个数组、列表和 json 对象的最佳方式。 使用 zip(),我们可以用一个 for 循环遍历给定的两个 json 字典。

    import json
    user = {
        'name': 'Bob',
        'age': '11',
        'place': 'moon',
        'dob': '12/12/12'
    }
    
    user1 = {
        'name': 'John',
        'age': '13',
        'place': 'Earth',
        'dob': '12/12/12'
    }
    for (u, u1) in zip(user, user1): 
         print(user[u], user1[u1])
    

    结果

    鲍勃·约翰

    11 13

    月球地球

    12/12/12 12/12/12

    【讨论】:

      【解决方案4】:

      您可以这样做,根据您的范围使用globalslocals

      >>> for i in range(2):
      ...     print(globals()['user' + str(i)])
      ... 
      {'name': 'Bob', 'age': '11', 'place': 'moon', 'dob': '12/12/12'}
      {'name': 'John', 'age': '13', 'place': 'Earth', 'dob': '12/12/12'}
      

      但正如 cmets 所述,我建议使用列表:

      >>> users = [user0, user1]
      >>> for i in range(2):
      ...     print(users[i])
      ... 
      {'name': 'Bob', 'age': '11', 'place': 'moon', 'dob': '12/12/12'}
      {'name': 'John', 'age': '13', 'place': 'Earth', 'dob': '12/12/12'}
      

      【讨论】:

      • 在第二个循环中for user in users 比使用索引要好得多!
      • 为建议干杯
      【解决方案5】:

      理想情况下,您应该使用chainmap 来遍历多个字典。 从 itertools 导入链图,例如:

      from itertools import Chainmap
      d1 = {'k1': 'v1'}
      d2 = {'k2': 'v2'}
      
      for k, v in (d1,d2).items():
        print(k,v)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        相关资源
        最近更新 更多