2016-06-13 168 views
0

从配置文件中,我想遍历包含usersrepositoriespassword的列表,然后将这些值分配给变量以使用github3.py创建存储库对象。Python:遍历列表或不等长

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() 
+0

如果用户列表长于存储库列表会怎么样? – donkopotamus

+0

用户列表永远不会超过存储库列表。存储库列表将始终等于或长于用户列表。 – DBS

回答

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

0

使用哈希(词典在Python,我认为)

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

比你可以用myHash['user1']['repos'][-1]

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')] 
0

我想说的更好的方法是为每一位用户回购映射在一个字典,但最接近你想要的是像这样

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