2016-06-13 109 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()