Python:迭代列表或不等长度

时间:2016-06-13 22:57:31

标签: python list iteration

从配置文件中,我想迭代包含usersrepositoriespassword的列表,然后将这些值分配给变量以使用创建存储库对象github3.py。

userrepo_name列表长度不相等。目前,有两个用户和几个回购,但这可能会随着时间的推移而改变。我曾尝试使用zip,但只有列表长度相同才能使用user。我希望它能够保留repo_name列表中的最后一个值,并将其与user2,repo3列表中的最后一个列表(user = ["user1","user2"] repo_name = ["repo1","repo2","repo3"] password = "xxxxxxxxx" )进行映​​射。

from global_var import *
for users, repos in zip(user, repo_name)
    gh = login(users, password)
    repo = gh.repository(users, repos)
    list_all_prs()

以下代码是我想要使用这些值的地方。

{{1}}

4 个答案:

答案 0 :(得分:3)

假设存储库列表总是至少与用户列表一样长,那么您只需使用itertools.zip_longest将它们压缩在一起:

for u, r in itertools.zip_longest(user, repo_name, fillvalue=user[-1]):
    ...

如您所知,zip在最短迭代时间结束后结束。相反,zip_longest将持续到最长的可迭代用尽,使用给定的fillvalue(默认为None),此时无法再从较短的迭代中获取值。

所以在这里,我们可以简单地将fillvalue设置为user的最后一个成员,让它在剩余的存储库中进行广播。

(在python 2.7中,这个迭代器名为itertools.izip_longest

答案 1 :(得分:0)

使用哈希(我认为Python中的字典)

myHash = { 
    'user1': {
      'repos' : [],
      'password' : 'cat123'
  },
    'user2': {
      'repos' : [],
      'password' : 'cat123'
  },
}

比使用myHash['user1']['repos'][-1]

获取最后一个回购

答案 2 :(得分:0)

使用itertools模块中的izip_longest方法压缩最长的可迭代。如果较短列表中没有值,则返回“None”,因此您需要在函数或循环中捕获它。

import itertools as it

a = []

    for user,repo in it.izip_longest(users,repo_name):
        if user: a.append((user,repo))
        else:  a.append((users[-1],repo))  

a

Output: [('user1', 'repo1'), ('user2', 'repo2'), ('user2', 'repo3')]

答案 3 :(得分:0)

我说更好的方法是将每个用户映射到dict中的repo,但最接近你想要的东西是这样的

##assuming repos.len() >= users.len() and users is not empty
password = XXX
while repos:
    if users:
        user = users.pop()
    gh = login(user, password)
    repo = gh.repository(user, repos.pop())
    list_all_prs()