【问题标题】:Creating a mixed python data structure by iterating over a list of lists通过迭代列表列表来创建混合 python 数据结构
【发布时间】:2015-03-02 19:43:10
【问题描述】:

我需要向 API 提供数据,该 API 从系统中创建或删除用户。有效负载的语法如下:

b.User.create([{'user': {'name': 'kylie','full_name': 'kylie'}, 
                'password': {'is_encrypted': True, 'password': 'letmein'}, 
                'perms': [{'partition': '/Common', 'role': 'USER_ROLE_GUEST'}], 
                'login_shell': '/sbin/nologin'}])

b.User.delete(['ron'])

很明显,创建用户负载是一个字典列表,而字典又由字典组成。删除负载只是一个简单的名称列表。

我的示例输入数据是一个列表列表,如下所示:

[['NEW','kylie','OPERATOR','/sbin/nologin'],['DELETE', 'ron', 'ADMINISTRATOR', '/sbin/bash'],['NEW','jessie','GUEST','sbin/nologin']]

需要注意的几点:

  1. NEW 是要创建的用户,DELETE 是要删除的用户

  2. 密码是加密布尔值,密码和分区值始终是固定的,不需要从输入中获取,与示例相同。

迭代输入数据以创建此有效负载的最佳方法是什么?

【问题讨论】:

    标签: python list for-loop dictionary


    【解决方案1】:

    只需迭代输入数据,像这样

    data = [['NEW', 'kylie', 'OPERATOR', '/sbin/nologin'],
            ['DELETE', 'ron', 'ADMINISTRATOR', '/sbin/bash'],
            ['NEW', 'jessie', 'GUEST', 'sbin/nologin']]
    
    for record in data:
        if record[0] == 'NEW':
            b.USER.create([get_user_object(*record[1:])])
        else:
            b.USER.delete([record[1]])
    

    你可以像这样实现get_user_object

    def get_user_object(name, role, shell):
        return {
            'user': {
                'name': name,
                'full_name': name
            },
            'password': {
                'is_encrypted': True,
                'password': 'letmein'
            },
            'perms': [{
                'partition': '/Common',
                'role': role
            }],
            'login_shell': shell
        }
    

    【讨论】:

    • 这真是太棒了..只是为了理解为什么在调用 get_user_object 函数时需要 *
    • @Amistad record[1:] 将创建一个子列表,子列表的元素应作为参数一一传递给get_user_object。所以,we use * to unpack the arguments.
    • 类似于我在 django 代码中经常看到的 *args 和 **kwargs ?
    • @Amistad 是的......那是为了打包......在这里我们做相反的事情。请检查我在上一条评论中提到的文档链接。那里已经解释过了。
    • 是的..我经历过..非常感谢您的回答并向我解释..
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多