2016-12-08 2 views
-1

Ich versuche n Tabellen (Listen, die dicts enthält) zu kombinieren, wenn die gemeinsamen Schlüssel die gleichen Werte haben. Daher verwende ich * arg und zwei andere Tabellen. Mein Code arbeitete in Ordnung mit zwei Tischen, aber aus einem unbekannten Grund * senden Argumente nichts zurück. Mein CODE:kombinieren n dicts in einer Liste von dicts

def join(tbl1, tbl2, *args): 
    _dic = {} 
    _list = [] 
    dictsOutOfArgs = [] 
    for d in args: 
     dictsOutOfArgs.append(d) 
    for t1, t2 , arg in zip(tbl1, tbl2, dictsOutOfArgs): 
     for i , j , z in zip(t1, t2, arg): 
      if i == j == z and t1.get(i) == t2.get(j) == arg.get(z): 
       _dic = t1.copy() 
       _dic.update(t2) 
       _dic.update(arg) 
       _list.append(_dic) 

    return _list 

if __name__ == '__main__': 
    import pprint 
    print(test_answer()) 
    print(test_answer1()) 
    series = [ 
    {'s_id': 'bb', 'title': 'Breaking Bad'}, 
    {'s_id': 'bcs', 'title': 'Better Call Saul'}] 
    characters = [ 
    {'c_id': 'ww', 'family_name': 'White', 'given_name': 'Walter'}, 
    {'c_id': 'sw', 'family_name': 'White', 'given_name': 'Skyler'}, 
    {'c_id': 'sg', 'family_name': 'Goodman', 'given_name': 'Saul'}] 
    series_characters = [ 
    {'c_id': 'ww', 's_id': 'bb'}, 
    {'c_id': 'sw', 's_id': 'bb'}, 
    {'c_id': 'sg', 's_id': 'bb'}, 
    {'c_id': 'sg', 's_id': 'bcs'}] 
    x = join(series_characters, series, characters) 

    pprint.pprint(x) 

erwartete Ausgabe:

[{'c_id': 'ww', 
    'family_name': 'White', 
    'given_name': 'Walter', 
    's_id': 'bb', 
    'title': 'Breaking Bad'}, 
    {'c_id': 'sw', 
    'family_name': 'White', 
    'given_name': 'Skyler', 
    's_id': 'bb', 
    'title': 'Breaking Bad'}, 
    {'c_id': 'sg', 
    'family_name': 'Goodman', 
    'given_name': 'Saul', 
    's_id': 'bb', 
    'title': 'Breaking Bad'}, 
    {'c_id': 'sg', 
    'family_name': 'Goodman', 
    'given_name': 'Saul', 
    's_id': 'bcs', 
    'title': 'Better Call Saul'}] 

Rückkehr ist: [] und ich denke, der Grund, dass argss ist keine Werte nicht haben, so kehrt die, wenn die Bedingung falsch ist.

irgendwelche Ideen?

+0

aus dem Code, kann ich nicht sagen, was Sie versuchen zu erreichen. Kannst du erklären, was du willst? Es sieht so aus, als ob Sie erwarten, dass 'zip' einen natürlichen Join durchführt? – cmd

+0

@PaulRooney verschmelzen n dicts, die die gleichen Schlüssel und die gleichen Werte haben – james

+0

@cmd zip holt die dicts von den Listen heraus die andere für Schleife gitting die Schlüssel der dicts das if und was als nächstes kommt, was Ihr zu einem "natürlichen beitreten ", ich weiß nicht, wie hast du das verstanden :) – james

Antwort

1

so etwas wie dies vielleicht (man beachte seine ein wenig pingelig Reihenfolge der Tabellen):

def join(tbl1, *args): 
    ret_list = [] 
    for obj in tbl1: 
     consolidated = obj.copy() 
     for join_tbl in args: 
      keys = consolidated.viewkeys() & join_tbl[0].viewkeys() 
      match_obj = next(o for o in join_tbl if all(consolidated.get(k) == o.get(k) for k in keys)) 
      if match_obj: 
       consolidated.update(match_obj) 
     ret_list.append(consolidated) 
    return ret_list 

join(series_characters, series, characters) kehrt

{'c_id': 'ww', 'given_name': 'Walter', 'title': 'Breaking Bad', 's_id': 'bb', 'family_name': 'White'} 
{'c_id': 'sw', 'given_name': 'Skyler', 'title': 'Breaking Bad', 's_id': 'bb', 'family_name': 'White'} 
{'c_id': 'sg', 'given_name': 'Saul', 'title': 'Breaking Bad', 's_id': 'bb', 'family_name': 'Goodman'} 
{'c_id': 'sg', 'given_name': 'Saul', 'title': 'Better Call Saul', 's_id': 'bcs', 'family_name': 'Goodman'} 
+0

danke für Ihre Antwort, aber was ist, wenn ich tbl1 und tbl2 – james

+0

Es verwendet die Basistabelle, die Sie wollen, als tbl1 alle anderen Tabellen als args. Im Grunde macht es eine 'linke äußere natürliche Verbindung' mit jeder anderen Tabelle in der angegebenen Reihenfolge. dh. left outer natural verbindet series_characters mit series, dann nehmen Sie dieses konsolidierte Ergebnis und linken äußeren natürlichen Joins zu Zeichen. tbl1 wird nur als Starttabelle verwendet. – cmd

+0

oder sagst du, dass du den Funktionskopf von 'def join (tbl1, tbl2, * args):' aus irgendeinem Grund haben musst? – cmd

Verwandte Themen