代码之家  ›  专栏  ›  技术社区  ›  nerdfever.com

python列表中的命名索引偏移量?

  •  1
  • nerdfever.com  · 技术社区  · 6 年前

    有没有一种好的方法可以命名一个列表中的索引偏移量?

    我有一个列表列表,每个列表代表我的脚本将设置的帐户:

    #                        un       pw        doit   admin
    ExtraAccounts       = [["Fred", "fredpw1",  True,  False],
                           ["Jane", "ibjane",   True,  True],
                           ["Wen",  "35syzwen", False, True],
                          ]
    

    所以用户名“fred”将设置为密码“fredpw1”,而不是管理员。等。

    每个子列表的索引[0]是用户名,[1]密码,[3]是帐户是否为管理员。

    这会导致如下代码:

    for acct in ExtraAccounts:
        if acct[2]:
            setupAccount(acct[0], acct[1], acct[3])
    

    很难阅读,因为它远不明显acct[0]、acct[1]、acct[2]等代表什么。

    我想使用命名的元组,但我还需要更改程序中列表的内容,如下所示:

    for acct in ExtraAccounts:
            acct[2] = aComplicatedFunction(acct[0])
    

    所以我拒绝使用命名的元组,因为它们是不可变的。

    我想出了一个解决办法:

    User  = 0 # index offsets
    Pass  = 1
    Doit  = 2
    Admin = 3
    #                        un       pw        doit   admin
    ExtraAccounts       = [["Fred", "fredpw1",  True,  False],
                           ["Jane", "ibjane",   True,  True],
                           ["Wen",  "35syzwen", False, True],
                          ]
    
    for acct in ExtraAccounts:
        acct[Doit] = aComplicatedFunction(acct[User])
    
    for acct in ExtraAccounts:
        if acct[Doit]:
            setupAccount(acct[User], acct[Pass], acct[Admin])
    

    …但我很确定这不是“正确的方法”。

    更好的方法是什么?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Ry-    6 年前

    上课?

    class Account:
        def __init__(self, username, password, doit, admin):
            self.username = username
            self.password = password
            self.doit = doit
            self.admin = admin
    
    
    extra_accounts = [
        #        un       pw        doit   admin
        Account("Fred", "fredpw1",  True,  False),
        Account("Jane", "ibjane",   True,  True),
        Account("Wen",  "35syzwen", False, True),
    ]
    
    for acct in extra_accounts:
        acct.doit = a_complicated_function(acct.username)
    
    for acct in extra_accounts:
        if acct.doit:
            setup_account(acct.username, acct.password, acct.admin)
    
        2
  •  1
  •   chadlagore    6 年前

    你要找的是 dict .

    extra_accounts = [
        {'user': 'Fred', 'pw': 'fredpw1', 'doit': True, 'admin': False},
        {'user': 'Jane', 'pw': 'ibjane', 'doit': True, 'admin': True},
        {'user': 'Wen', 'pw': '35syzwen', 'doit': False, 'admin': True},
    ]
    
    for acct in extra_accounts:
        if acct['doit']:
            setup_account(acct['user'], acct['pass'], acct['admin'])
    

    注意明文密码。

        3
  •  1
  •   Sufiyan Ghori    6 年前

    我本来会使用 namedtuple 但是由于您的要求是可变的,所以您可以使用 dict() 来创建字典,其中包含 user as key和 dict as values for other variables。我个人觉得很容易阅读,

    代码,

    userdata=“fred”:“pw”:“passw”,“doit”:false,“admin”:false
    
    
    获取密码,
    打印(用户数据[“fred”][“pw”])
    
    行政管理?
    打印(用户数据[“fred”][“admin”])
    < /代码> 
    
    

    或者,如果您想要更清晰的代码,可以使用recordtype

    recordtype提供工厂功能,名为recordtype.recordtype。它类似于collections.namedDuple,具有以下区别:

    • recordtype实例是可变的。
    • recordtype支持每个字段的默认值。
    • recordtype支持一个可选的默认值,供所有字段使用,没有显式的默认值。

    比如,

    从记录类型导入记录类型 account_data=recordtype('account'、'user pw doit admin') 帐目= 帐户数据(“fred”,“fredpw1”,true,false), 账户数据(“Jane”,“IbJane”,真,真) 账户数据(“Wen”,“35SyzWen”,假,真) ] 对于帐户中的帐户: #更改密码 account.pw=“新密码” < /代码>

    注意:您需要手动安装它pip install recordtype

    编辑与User作为关键和dict作为其他变量的值。我个人觉得很容易阅读,

    代码,

    userData = {"Fred": {"pw": "passw", "doit" : False, "admin": False}}
    
    
    # Get password,
    print(userData["Fred"]["pw"])
    
    # admin?
    print(userData["Fred"]["admin"])
    

    或者如果你想要更清晰的代码,你可以使用recordtype

    记录类型提供工厂函数,名为recordtype.recordtype. 它类似于collections.namedtuple,区别如下:

    • 记录类型实例是可变的。
    • 记录类型支持每个字段的默认值。
    • recordtype支持可选的默认值,所有字段都不使用显式的默认值。

    有点像

    from recordtype import recordtype
    
    account_data = recordtype('Account', 'user pw doit admin')
    accounts = [
        account_data("Fred", "fredpw1",  True,  False),
        account_data("Jane", "ibjane",   True,  True),
        account_data("Wen",  "35syzwen", False, True),
       ]
    
    for account in accounts:
        # change password
        account.pw = "new password"
    

    注意:您需要手动安装pip install recordtype