从配置文件中,我想迭代包含users
,repositories
和password
的列表,然后将这些值分配给变量以使用创建存储库对象github3.py。
user
和repo_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}}
答案 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()