2016-06-13 5 views
0

Von einer Konfigurationsdatei möchte ich über eine Liste, die users, repositories und password enthält, iterieren und dann diese Werte zuweisen, um ein Repository-Objekt mit github3.py zu erstellen . Die user und repo_name Listen sind nicht gleich lang. Momentan gibt es zwei Benutzer und mehrere Repos, aber das kann sich im Laufe der Zeit ändern. Ich habe versucht, zip zu verwenden, aber es funktioniert nur, wenn die Listen die gleiche Länge haben. Ich möchte dafür den letzten Wert in der user Liste behalten und diesen mit dem letzten Repo in der repo_name Liste (user2,repo3) abbilden.Python: Iterieren über eine Liste oder ungleiche Längen

user = ["user1","user2"] 
repo_name = ["repo1","repo2","repo3"] 
password = "xxxxxxxxx" 

Der folgende Code ist, wo ich diese Werte verwenden möchte.

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

Was ist, wenn die Benutzerliste länger als die Repository-Liste ist? – donkopotamus

+0

Die Benutzerliste wird niemals länger als die Repository-Liste sein. Die Repository-Liste ist immer gleich oder länger als die Benutzerliste. – DBS

Antwort

3

Unter der Annahme, dass die Repository-Liste wird immer mindestens so lang wie der Benutzerliste sein, dann können Sie einfach itertools.zip_longest verwenden sie zusammen zip:

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

Wie Sie beachten, zip endet nach der kürzeste iterable ist erschöpft. Im Gegensatz dazu wird zip_longest fortgesetzt, bis die längste Iterable ausgeschöpft ist, wobei fillvalue (standardmäßig None) verwendet wird, wenn den kürzeren Iterablen kein Wert mehr entnommen werden kann.

Hier können wir einfach fillvalue als das letzte Mitglied von user setzen, um es über die restlichen Repositories zu übertragen.

(In Python 2.7 dieser Iterator itertools.izip_longest genannt)

0

Verwenden Sie einen Hash (Wörterbuch in Python Ich denke)

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

, als Sie das letzte Repo mit myHash['user1']['repos'][-1]

0

Verwenden izip_longest Methode im itertools Modul der längsten zip über bekommen kann iterierbar. Dadurch wird "None" zurückgegeben, wenn in der kürzeren Liste kein Wert vorhanden ist. Sie müssten dies also in einer Funktion oder Schleife abfangen.

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

ich der bessere Weg würde sagen, ist jedem Benutzer eines Repo in einem dict auf der Karte, aber die nächste Sache, was Sie wollen, ist so etwas wie dieses

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