2017-07-25 5 views
2

Ich habe eine DB-Abfrage, die drei Datensätze zurückgibt. Es kommt in diesem Format.Kombinieren Sie Daten aus mehreren Listen unterschiedlicher Länge

year = (('Adison', '355', 4), ('windsor windham', '455', 6), ('windham', '655', 2), ('btown', '233', 5)) 
month = (('Adison', '355', 2), ('windham', '655', 1)) 
week = (('btown', '233', 8), ('Adison', '355', 9)) 

Die Jahresliste ist immer die längste mit den meisten Werten. Ich muss den letzten Wert von jedem Element in den Monats- und Wochenlisten nehmen und sie an der richtigen Stelle an die Jahresliste anhängen, basierend auf der Stadt.

IF gibt es nicht einen entsprechenden Wert in Monat oder Woche, ich brauche eine 0 Ideal anhängen macht es so aussehen:

year = (('Adison', '355', 4, 2, 9), ('windsor windham', '455', 6, 0, 0), ('windham', '655', 2, 1, 0), ('btown', '233', 5, 0, 8)) 

ich versucht habe man zwei Listen in einer for-Schleife und unter Verwendung eines if in Bedingung, um Werte zu überprüfen, aber ich denke, dass ich etwas übersehen habe und Indexfehler erhalte. Ich habe versucht, so etwas wie dieses:

for each in year: 
    for part in month: 
     if part in each: 
      each.append(part[-1]) 
     else: 
      each.append(0) 

Ich weiß, dass es einen besseren Weg zu sein hat, und eine, die dies tatsächlich funktioniert zu erreichen. Gibt es ein Werkzeug oder Modul, das ich untersuchen sollte? Ich habe mit zip gespielt, aber weil sie nicht die gleiche Länge haben, habe ich Probleme. Danke!

EDIT

Ich verstehe, dass ich Tupeln oben haben, In meinem Code ein, sie konvertieren alle Objekte aufzulisten, bevor ändern. Ich bin auch auf Python 3.6

+0

In welcher Python-Version bist du? –

+0

Ich benutze 3.6. – Joe

+0

Python-Tupel sind unveränderlich, daher haben sie keine '.append'-Methode. Du musst Sachen machen wie 'new_tuple = old_tuple + ('more', 'data')' –

Antwort

0

Zuerst Schlüssel ein dict aus den ersten beiden Elementen, mit Nullen als Standard für Monat und Woche. Dann füllen Sie bei Bedarf den Monat und die Woche aus:

data = {(name, n): [y, 0, 0] for name, n, y in year} 

for name, n, m in month: 
    data[name, n][1] = m 

for name, n, w in week: 
    data[name, n][2] = w 

data = tuple(tuple([*k, *v]) for k, v in data.items()) 
+1

Perfekt gearbeitet Danke @wim – Joe

2

Sie können dicts von den month und week Tupel bauen und holen Werte von den neuen Anhängen der neuen Werte Unter -Tupeln zu erstellen. Mit dict.get(..., 0) ermöglicht eine Standard-0 für die Städte zu setzen, Monat oder Woche keine Daten haben:

dct_mth = {k: v for k, _, v in month} 
dct_week = {k: v for k, _, v in week} 

year = list(year) # make container mutable 
for i, yr in enumerate(year): 
    year[i] += (dct_mth.get(yr[0], 0), dct_week.get(yr[0], 0)) 

print(year) 
# [('Adison', '355', 4, 2, 9), ('windsor windham', '455', 6, 0, 0), ('windham', '655', 2, 1, 0), ('btown', '233', 5, 0, 8)] 
+0

Ich weiß nicht, wie ich es falsch gemacht habe, aber es ist einfach Hinzufügen von Nullen zu jeder Liste, die nicht wirklich mit Werten aktualisiert werden – Joe

+0

@Joe Stellen Sie sicher, dass die Wörterbuchschlüssel die gleichen Zeichenfolgen enthalten wie in 'Jahr'. –

0

Ist das nützlich?

year = [['Adison', '355', 4],['windsor windham', '455', 6], 
     ['windham', '655', 2],['btown', '233', 5]] 

month = [['Adison', 355, 2],['windham', '655', 1]] 

week = [['btown', '233', 8],['Adison', '355', 9]] 

for y in year: 
    for m in month: 
    if y[0] == m[0]: 
     y.append(m[-1]) 
    for w in week: 
    if y[0] == w[0]: 
     y.append(w[-1]) 

for each in year: 
    print(each) 

[ 'Adison', '355', 4, 2, 9]

[ 'windsor Windham', '455', 6]

[ 'Windham',‘ 655' , 2, 1]

[ 'btown', '233', 5, 8]

0

Der folgende Code zuerst die Daten zu dicts umwandelt, und kombiniert dann die Daten aus dem Monat & Woche dicts in das Jahr dict. Schließlich konvertiert es die kombinierten Daten in eine Liste von Tupeln.

Ich verwende dicts, weil es viel schneller ist, Elemente nach ihrem Schlüssel in einem dict nachzuschlagen, als durch eine Liste oder ein Tupel, Element für Element nach Übereinstimmungen zu suchen. Es macht keinen großen Unterschied, wenn es nur eine Handvoll Dinge gibt, aber wenn Ihre realen Daten Dutzende oder Hunderte von Städten haben, wäre der Geschwindigkeitsunterschied sehr groß.

Ich nehme an, dass die Nummer, die dem Stadtnamen folgt, eine Art ID-Code ist, so dass wir mehrere Städte mit demselben Namen aber unterschiedlichen ID-Nummern haben können. So benutzen meine Dicts den Namen und die Nummer als Schlüssel.

year = (('Adison', '355', 4), ('windsor windham', '455', 6), ('windham', '655', 2), ('btown', '233', 5)) 
month = (('Adison', '355', 2), ('windham', '655', 1)) 
week = (('btown', '233', 8), ('Adison', '355', 9)) 

# Convert a nested tuple to a dict, using the first 2 fields 
# in the tuple as the key and the last field as the value. 
def make_dict(seq): 
    return {u[:-1]: [u[-1]] for u in seq} 

year = make_dict(year) 
month = make_dict(month) 
week = make_dict(week) 

# Add the month & week data to the year data 
for k in year: 
    year[k] += month.get(k, [0]) + week.get(k, [0]) 
print(year) 

# Convert the updated year dict to a list of tuples 
data = [] 
for k, v in year.items(): 
    data.append(k + tuple(v)) 
for row in data: 
    print(row) 

Ausgang

{('Adison', '355'): [4, 2, 9], ('windsor windham', '455'): [6, 0, 0], ('windham', '655'): [2, 1, 0], ('btown', '233'): [5, 0, 8]} 
('Adison', '355', 4, 2, 9) 
('windsor windham', '455', 6, 0, 0) 
('windham', '655', 2, 1, 0) 
('btown', '233', 5, 0, 8) 

Wenn Sie data wollen ein Tupel von Tupeln sein, tun nur data = tuple(data). OTOH, das dict-Formular ist wahrscheinlich nützlicher als eine Liste.

Verwandte Themen