合并两个具有相同键的字典列表:python中的值

时间:2016-12-05 18:37:20

标签: python dictionary merge key

良好的平衡, 如果它们具有相同的键,我想合并两个dictonaries列表:value in it。它就像SQL中的连接一样。我不允许为此问题导入任何模块。

这是一个例子:

输入:

>>> series = [
... {'s_id': 'bb', 'title': 'Breaking Bad'},
... {'s_id': 'bcs', 'title': 'Better Call 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'}

输出应该是一个包含内部信息的dicts列表:

out= [
{'s_id': 'bb', 'title': 'Breaking Bad', 'c_id': 'ww'},
{'s_id': 'bcs', 'title': 'Better Call Saul', 'c_id': 'sg'}]

我尝试过这样的事情,但我认为我的想法很复杂,而且代码仍然有效:

def _join(tbl1, tbl2):
    """
    Helping function to merge two tables inform of a list

    Argurments:
        tbl1 (list): list of dict's containung a table
        tbl2 (list): list of dict's containung a table
    Returns:
        back_lst (list): list, containing wanted rows of the table

    """
    back_lst = []
    for element1 in tbl1:
        for element2 in tbl2:
            for key in tbl1[element1]:
                if tbl1[element1[key]] == tbl2[element2[key]]:
                    a = tbl1[element1].copy()
                    a.update(tbl2[element2])
                    back_lst.append(a)
    return back_lst

在这里得到一些帮助会很高兴。提前谢谢。

3 个答案:

答案 0 :(得分:3)

鉴于您所有的键都只是字符串,您可以这样做:

>>> [dict(a, **b) for a in series_characters for b in series if a['s_id'] == b['s_id']]
[{'c_id': 'ww', 's_id': 'bb', 'title': 'Breaking Bad'},
 {'c_id': 'sw', 's_id': 'bb', 'title': 'Breaking Bad'},
 {'c_id': 'sg', 's_id': 'bb', 'title': 'Breaking Bad'},
 {'c_id': 'sg', 's_id': 'bcs', 'title': 'Better Call Saul'}]​

答案 1 :(得分:0)

假设tbl1[element1]是一个dicts列表,你不想做tbl1element1应该已经是你想要的词典,所以只需element1.copy()。索引tbl2也是如此。

答案 2 :(得分:0)

# your code goes here

def joinTable( tbl1, tbl2 ):
    op = []
    if len( tbl1 )  > 0 and len( tbl2 ) > 0:
        keys = set( tbl1[0].keys()).intersection( tbl2[0].keys())
        opkeys = set( tbl1[0].keys()).union( tbl2[0].keys())
        for row1 in tbl1:
            key1 = set( row1.keys())
            for row2 in tbl2:
                key2 = set( row2.keys())
                assert key1.intersection( key2 ) == keys
                assert key1.union( key2 ) == opkeys
                match = True
                for key in keys:
                    match = row1[ key] == row2[key]
                if match:
                    d = dict()
                    for key in opkeys:
                        d[ key ] = row1[ key ]  if key in row1 else row2[key]
                    op.append( d )
    return op

print joinTable( [{'s_id': 'bb', 'title': 'Breaking Bad'},{'s_id': 'bcs', 'title': 'Better Call Saul'}],[
{'c_id': 'ww', 's_id': 'bb'},{'c_id': 'sw', 's_id': 'bb'}, {'c_id': 'sg', 's_id': 'bb'},{'c_id': 'sg', 's_id': 'bcs'}])

Ideone

它实现了SQL的连接算法。与https://blogs.msdn.microsoft.com/craigfr/2006/08/03/merge-join/类似的东西。

您可以进一步将此扩展为特定键并限制值。