2016-08-13 8 views
-1

Ich lerne Python und ich liebe, dass Sie iterierbare Objekte durchlaufen können, ohne ständig Indexvariablen zu erstellen.Python-Schleifen ohne Index

Aber ich finde mich selbst immer wieder Indexvariablen erstellen, so dass ich sie in Aufrufen von parallelen Objekten verweisen kann. Wie wenn ich zwei Listen oder eine Liste und ein Wörterbuch vergleiche.

Wie gewünscht: einige Beispiele

`s= "GAGCCTACTAACGGGAT"# the strings we are evaluating 
t= "CATCGTAATGACGGCCT" 

c = 0# c = position of interest within the strings 
m = 0 # m = number of mutations found so far. 

for i in s: # cycling through all nucleotides listed in s 
if(i == t[c]): #compare s[c] to t[c] 
    c +=1 # if equal, increase position counter 
else: 
    c+=1 # if not equal, increase both position and     
    m+=1  #mutation counters.` 

UND

def allPossibleSubStr(s): #takes a dict of strings, finds the shortest, and produces a list of all possible substrings, thus a list of possible common substrings to all elements of the original dict 
ks = s.keys() 
c=0 #counter 
j=0 # ks place holder for shortest string 
subSTR = [] 

for i in ks: #finds the shortest entry in stringDict 
    if(s[i] < s[ks[(c+1)%len(s)]]): 
     j=c 
    c +=1 

c=s[ks[j]] #c is now a string, the shortest... 
j=ks[j] # j is now a key string, the shortest... 
n = (len(c)*(len(c)+1))/2 # number of subsets of c 

#producing a list of possible substrings 
for i in range(len(c)): 
    for k in range(len(c)-i): 
     subSTR.append(c[i:i+k+1]) 
     #print("i =" +str(i)+ " and k=" + str(k)) 
#is there a list function with eleminates duplicate entries. 
subSTR=list(set(subSTR))# a set does not have any duplicate entires 
subSTR.sort(key=len) # sorts substring from shortest to longest string 
subSTR.reverse() 

return subSTR 

Gibt es eine Möglichkeit, um dieses?

+1

Pflege ein Beispiel zu geben, was Sie meinen? –

+2

Bitte zeigen Sie ein Beispiel für die Verwendung der Indizes mit. Abhängig von Ihrem Anwendungsfall gibt es wahrscheinlich andere Möglichkeiten. Z.B. Wenn Sie zwei Listen haben, die Sie gleichzeitig durchlaufen müssen, können Sie 'zip()' verwenden. – poke

+0

Ich hatte gerade einen Blick auf mehr als 1000 for Schleifen in mehreren Python-Projekten von mir, und weniger als 10 verwenden Indizes (mit 'enumerate'). Also, wahrscheinlich übersiehst du einen besseren Weg, um deine Absicht auszudrücken. – spectras

Antwort

2

Es klingt wie Sie Code wie folgt schreiben:

for i, item in enumerate(list1): 
    if item == list2[i]: 
     ... 

Sie noch brauchen nicht ein expliziter Index, weil Sie die zwei Listen zippen und über eine Liste von Tupeln iterieren können.

for item1, item2 in zip(list1, list2): 
    if item1 == item2: 

Sie können mit zwei dicts das gleiche tun, obwohl, da sie ungeordnet sind, werden Sie wahrscheinlich nach ihrem Schlüssel zip wollen Sortierung:

for key1, key2 in zip(sorted(dict1), sorted(dict2)): 
2

Verwenden aufzuzählen ...

for i, item in enumerate(myList): 
    foo = parallelList[i] 

oder zip ...

for item, foo in zip(myList, parallelList): 
    ... 
+1

Dies hilft jedoch nicht wirklich dabei, Indizes zu vermeiden. – poke

+1

(ein Zip-Beispiel hinzugefügt) –

+0

Ich muss mit diesen spielen. Ich habe diese Befehle nicht zuvor gesehen. Zip und enumerieren. – Carl

Verwandte Themen