2016-12-08 28 views
-1

我試圖結合n個表(包含字典的列表),如果常用鍵具有相同的值。因此我使用* arg和另外兩個表.my代碼工作正常與兩張桌子,但由於某些未知的原因*參數沒有返回。 我的代碼:將n個字符組合在一個列表中

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) 

預期輸出:

[{'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'}] 

回報是:[] ,我認爲原因是argss沒有任何價值,所以如果條件返回false。

有什麼想法?

+0

從你的代碼,我不能告訴你要完成的任務。你能解釋你想要發生什麼嗎?它看起來像你期待'zip'執行自然連接? – cmd

+0

@PaulRooney合併n個具有相同密鑰和相同值的字典 – james

+0

@cmd zip從列表中獲取字典其他for循環字符串如果和接下來是什麼接下來你所提到的「自然加入「,我不知道你是如何理解:) – james

回答

1

也許這樣的事情(注意它有點挑剔表的順序排列):

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)回報

{'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

謝謝你的答案,但如果我得到tbl1和tbl2 – james

+0

它使用你想要的基表,因爲tbl1所有其他表作爲參數。基本上它按照指定的順序與其他表格進行「左外部自然連接」。即。 left outer natural將series_characters與系列連接起來,然後獲取該合併結果並將外部自然連接留給字符。 tbl1僅用作起始表。 – cmd

+0

還是你說你需要有'def join(tbl1,tbl2,* args):'出於某種原因的函數頭? – cmd

相關問題