2016-07-06 11 views
-1

Ich arbeite an der Konvertierung von Daten in einem Datumsformat in eine neue ID basierend auf anderen Informationen in der Kalkulationstabelle. Ich möchte auch _2, _3, etc. basierend auf späteren Ereignissen am selben Tag hinzufügen. Wenn also 3 Fälle von 20101212 in der dateID vorhanden sind, würde bei den letzten 2 Ereignissen ein _2 und _3 auf die ID modifiziert werden.Python-Schleifen: Genereller machen

Wie kann ich meine Lösung allgemeiner gestalten? Es funktioniert, aber es ist nicht sehr wiederverwendbar. Es ist derzeit nur hart codiert, wie ich in dieser spezifischen Tabelle weiß, gibt es nicht mehr als 3 Fälle eines bestimmten Datums. Wie kann ich den Code schreiben, um Ereignisse mit mehr als 3 Fällen am selben Tag zu erfassen, ohne dass weitere Elif-Anweisungen hinzugefügt werden?

dateID = [some list of strings in date format] 
GS = [some list of 2 letter strings to append to corresponding dates] 
#len(GS) = len(dateID) 
caseID = [] 
y = collections.Counter(dateID) 
#len(y) < len(dateID) 
j = 0 
for i in range(len(y)): 
    num_iter = sorted(y.iteritems())[i][1] 
    if num_iter == 1: 
     case = sorted(y.iteritems())[i][0] + GS[j] 
     caseID.append(case) 
     j = j + 1 
    elif num_iter == 2: 
     case = sorted(y.iteritems())[i][0] + GS[j] 
     caseID.append(case) 
     j = j + 1 
     case = sorted(y.iteritems())[i][0] + GS[j] + '_2' 
     caseID.append(case) 
     j = j + 1 
    elif num_iter == 3: 
     case = sorted(y.iteritems())[i][0] + GS[j] 
     caseID.append(case) 
     j = j + 1 
     case = sorted(y.iteritems())[i][0] + GS[j] + '_2' 
     caseID.append(case) 
     j = j + 1 
     case = sorted(y.iteritems())[i][0] + GS[j] + '_3' 
     caseID.append(case) 
     j = j + 1 
    else: 
     caseID.append('This catchs errors, add more elif num_iter == __') 


dateID = ['19820323','19831209','19840218','19840321','19840504','19841227','19841227','19850104','19850110','19850114'] 
GS = [u'Er', u'Er', u'Er', u'Er', u'Er', u'Mn', u'Mn', u'Er', u'Er', u'Er'] 

Antwort

2

Eine einfache Lösung Schleife so oft wie num_iter wäre. So etwas wie

base_string = sorted(y.iteritems())[i][0] 
for iter in range(num_iter): 
    case = base_string + GS[j] 
    case += '_{0}'.format(iter + 1) if iter > 0 else '' 
    caseID.append(case) 
    j += 1 

Beachten Sie, dass dies nur funktioniert, wenn Sie wollen im gleichen Format fortzusetzen. Ich habe auch sorted(y.iteritems())[i][0] in für bessere Leistung und lesbaren Code refaktoriert.

+0

Vielen Dank auch. Ich verstehe jetzt, dass deine Lösung ist, dass ich eine weitere Schleife über diese hinzufügen soll. Die pythonische Art, Code zu schreiben, verwirrte mich zuerst, da ich immer noch zu viele Schritte in meiner Programmierung habe. – Almidas

1

ohne gegen einige Daten testen zu können, versuchen Sie dies:

dateID = [some list of strings in date format] 
GS = [some list of 2 letter strings to append to corresponding dates] 
#len(GS) = len(dateID) 
caseID = [] 
y = collections.Counter(dateID) 
#len(y) < len(dateID) 
j = 0 
for i in range(len(y)): 
    num_iter = sorted(y.iteritems())[i][1] 
    for k in range(num_iter): 
     append_string = '_' + str(k + 1) if k != 0 else "" 
     case = sorted(y.iteritems())[i][0] + GS[j] + append_string 
     caseID.append(case) 
     j += 1 
+0

Sie überschreiben die globale Variable 'j', die das Indexsystem des Askers für die Liste' GS' durcheinanderbringt. – EvilTak

+0

danke, das habe ich verpasst –

+0

Es ist immer noch nicht korrekt, 'j' wird verwendet, um auf das nächste Element in' GS' zuzugreifen. Ihr Code ruft wiederholt nur die ersten "num_iter" -Werte in 'GS' ab. – EvilTak