Skip to main content
 首页 » 编程设计

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

2025年05月04日15zengkefu

是否有一种很好的 Pythonic 方式来命名列表中的索引偏移量?

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

#                        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]) 

...但我很确定这不是执行此操作的“正确方法”。

什么是更好的方法?

请您参考如下方法:

要上课吗?

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)