良好的平衡, 如果它们具有相同的键,我想合并两个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
在这里得到一些帮助会很高兴。提前谢谢。
答案 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列表,你不想做tbl1
。 element1
应该已经是你想要的词典,所以只需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'}])
它实现了SQL的连接算法。与https://blogs.msdn.microsoft.com/craigfr/2006/08/03/merge-join/类似的东西。
您可以进一步将此扩展为特定键并限制值。