Python 通过循环更新dict中的键

Python 通过循环更新dict中的键,python,python-3.x,Python,Python 3.x,我正在尝试创建一个包含用户及其ssh密钥列表的dict 用户列表和ssh密钥存储在需要从中获取信息的不同yaml文件中。这些文件是“管理员”和“用户”,它们看起来像: 管理员文件: admins: global: - bob - john - jimmy - hubert SSH密钥文件: users: bob: fullname: Bob McBob ssh-keys: ssh-rsa "thisismysshkey"

我正在尝试创建一个包含用户及其ssh密钥列表的dict

用户列表和ssh密钥存储在需要从中获取信息的不同yaml文件中。这些文件是“管理员”和“用户”,它们看起来像:

管理员文件:

admins:
  global:
    - bob
    - john
    - jimmy
    - hubert
SSH密钥文件:

users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa "thisismysshkey"


  john:
    fullname: John McJohn
    ssh-keys: 
      ssh-rsa "thisismysshkey"
到目前为止,我有以下代码:

import yaml

#open admins list as "f"
f = open("./admins.sls", 'r')
#creates "admins" list
admins = yaml.load(f)
#grab only needed names and make a list
admins = admins['admins']['global']

#convert back to dict with dummy values of 0
admin_dict = dict.fromkeys(admins, 0)
因此,在这一点上,我有一句格言:

print(admin_dict)
{'bob': 0, 'john': 0}
现在,我想遍历“admins”中的名称列表,并使用另一个文件中的ssh密钥更新密钥(当前设置为0)

因此,我:

f = open("./users.sls", 'r')
ssh_keys = yaml.load(f)

for i in admins:
    admin_dict[k] = ssh_keys['users'][i]['ssh-keys']
但当运行for循环时,只有一个值得到更新。 有点困在这里了,我已经超出了python的深度。。。我走对了吗

编辑: 将最后一个循环更改为:

for i in admins:
      for key, value in admin_dict.items():
          admin_dict[key] = ssh_keys['users'][i]['ssh-keys']

事情看起来好多了。这有效吗?

带有类似以下文件的
admin.yaml
文件:

admins:
  global:
    - bob
    - john
    - jimmy
    - hubert
还有一个
ssh\u key.yaml
类似于:

users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa: "bob-rsa-key"
  john:
    fullname: John McJohn
    ssh-keys: 
      ssh-rsa: "john-rsa-key"
  jimmy:
    fullname: Jimmy McGill
    ssh-keys:
      ssh-rsa: "jimmy-rsa-key"
      ssh-ecdsa: "jimmy-ecdsa-key"
您可以这样做,假设您想知道每个用户拥有哪种类型的ssh密钥(如果不只是在字典中对密钥类型的特定名称进行更深一层的索引):

输出:

{ 'bob': {'ssh-rsa': 'bob-rsa-key'},
  'hubert': None,
  'jimmy': {'ssh-ecdsa': 'jimmy-ecdsa-key', 'ssh-rsa': 'jimmy-rsa-key'},
  'john': {'ssh-rsa': 'john-rsa-key'}}
{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}
如果只需要rsa密钥,则可选择输出:

{ 'bob': {'ssh-rsa': 'bob-rsa-key'},
  'hubert': None,
  'jimmy': {'ssh-ecdsa': 'jimmy-ecdsa-key', 'ssh-rsa': 'jimmy-rsa-key'},
  'john': {'ssh-rsa': 'john-rsa-key'}}
{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}
通过对词典理解进行以下更改,实现了上述输出:

import yaml
import pprint


def main():
    with open('admin.yaml', 'r') as f:
        admins_dict = yaml.load(f, yaml.SafeLoader)
        admins_list = admins_dict['admins']['global']
    with open('ssh_keys.yaml', 'r') as f:
        ssh_dict = yaml.load(f, yaml.SafeLoader)
        users_dict = ssh_dict['users']

    admins_with_keys_dict = {
        admin: users_dict[admin]['ssh-keys'] if admin in users_dict else None
        for admin in admins_list
    }

    pp = pprint.PrettyPrinter(indent=2)
    pp.pprint(admins_with_keys_dict)


if __name__ == '__main__':
    main()
admin: users_dict[admin]['ssh-keys']['ssh-rsa'] if admin in users_dict else None
                                    ^^^^^^^^^^^

使用类似以下文件的
admin.yaml
文件:

admins:
  global:
    - bob
    - john
    - jimmy
    - hubert
还有一个
ssh\u key.yaml
类似于:

users:
  bob:
    fullname: Bob McBob
    ssh-keys: 
      ssh-rsa: "bob-rsa-key"
  john:
    fullname: John McJohn
    ssh-keys: 
      ssh-rsa: "john-rsa-key"
  jimmy:
    fullname: Jimmy McGill
    ssh-keys:
      ssh-rsa: "jimmy-rsa-key"
      ssh-ecdsa: "jimmy-ecdsa-key"
您可以这样做,假设您想知道每个用户拥有哪种类型的ssh密钥(如果不只是在字典中对密钥类型的特定名称进行更深一层的索引):

输出:

{ 'bob': {'ssh-rsa': 'bob-rsa-key'},
  'hubert': None,
  'jimmy': {'ssh-ecdsa': 'jimmy-ecdsa-key', 'ssh-rsa': 'jimmy-rsa-key'},
  'john': {'ssh-rsa': 'john-rsa-key'}}
{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}
如果只需要rsa密钥,则可选择输出:

{ 'bob': {'ssh-rsa': 'bob-rsa-key'},
  'hubert': None,
  'jimmy': {'ssh-ecdsa': 'jimmy-ecdsa-key', 'ssh-rsa': 'jimmy-rsa-key'},
  'john': {'ssh-rsa': 'john-rsa-key'}}
{ 'bob': 'bob-rsa-key',
  'hubert': None,
  'jimmy': 'jimmy-rsa-key',
  'john': 'john-rsa-key'}
通过对词典理解进行以下更改,实现了上述输出:

import yaml
import pprint


def main():
    with open('admin.yaml', 'r') as f:
        admins_dict = yaml.load(f, yaml.SafeLoader)
        admins_list = admins_dict['admins']['global']
    with open('ssh_keys.yaml', 'r') as f:
        ssh_dict = yaml.load(f, yaml.SafeLoader)
        users_dict = ssh_dict['users']

    admins_with_keys_dict = {
        admin: users_dict[admin]['ssh-keys'] if admin in users_dict else None
        for admin in admins_list
    }

    pp = pprint.PrettyPrinter(indent=2)
    pp.pprint(admins_with_keys_dict)


if __name__ == '__main__':
    main()
admin: users_dict[admin]['ssh-keys']['ssh-rsa'] if admin in users_dict else None
                                    ^^^^^^^^^^^

你上一个代码中的
k
是什么?没什么。。。我用“k”来表示它是dict的一个键。但是它没有任何定义,所以应该会引起一个错误。。。。你不能使用未定义的东西,因为这会使它不可复制。另外,您可以尝试使用dict comp:
admin_dict={usr:ssh_keys['users'][usr]['ssh-keys']for usr in admins}一次性完成此操作。
让我试试。我刚才也做了这件事,看起来真的很管用:
对于管理员中的I:for key,admin_dict.items()中的value:admin_dict[key]=ssh_keys['users'][I]['ssh-keys']
,这似乎是一种非常奇怪的方式,而且工作起来非常奇怪。这将使您的所有项目都具有上次管理员的相同值…上次代码中的
k
是什么?没什么。。。我用“k”来表示它是dict的一个键。但是它没有任何定义,所以应该会引起一个错误。。。。你不能使用未定义的东西,因为这会使它不可复制。另外,您可以尝试使用dict comp:
admin_dict={usr:ssh_keys['users'][usr]['ssh-keys']for usr in admins}一次性完成此操作。
让我试试。我刚才也做了这件事,看起来真的很管用:
对于管理员中的I:for key,admin_dict.items()中的value:admin_dict[key]=ssh_keys['users'][I]['ssh-keys']
,这似乎是一种非常奇怪的方式,而且工作起来非常奇怪。这将使您的所有项目具有相同的值的最后一个管理员。。。