组合具有相同键名的Python字典
我有两个单独的Python列表,它们在各自的字典中有共同的键名。第二个名为组合具有相同键名的Python字典,python,Python,我有两个单独的Python列表,它们在各自的字典中有共同的键名。第二个名为recordList的列表有多个字典,它们的键名与我要附加到第一个列表clientList的键名相同。以下是示例列表: clientList = [{'client1': ['c1','f1']}, {'client2': ['c2','f2']}] recordList = [{'client1': {'rec_1':['t1','s1']}}, {'client1': {'rec_2':['t2','s2']}}]
recordList
的列表有多个字典,它们的键名与我要附加到第一个列表clientList
的键名相同。以下是示例列表:
clientList = [{'client1': ['c1','f1']}, {'client2': ['c2','f2']}]
recordList = [{'client1': {'rec_1':['t1','s1']}}, {'client1': {'rec_2':['t2','s2']}}]
因此,最终结果将是这样的,因此记录现在位于clientList
中的多个词典的新列表中
clientList = [{'client1': [['c1','f1'], [{'rec_1':['t1','s1']},{'rec_2':['t2','s2']}]]}, {'client2': [['c2','f2']]}]
看起来很简单,但我正在努力找到一种方法,使用变量迭代这两个字典,以找到它们匹配的位置 假设您想要一个对应于两个列表中每个键的值列表,请尝试以下操作:
from pprint import pprint
clientList = [{'client1': ['c1','f1']}, {'client2': ['c2','f2']}]
recordList = [{'client1': {'rec_1':['t1','s1']}}, {'client1': {'rec_2':['t2','s2']}}]
clientList.extend(recordList)
outputList = {}
for rec in clientList:
k = rec.keys()[0]
v = rec.values()[0]
if k in outputList:
outputList[k].append(v)
else:
outputList[k] = [v,]
pprint(outputList)
它将产生以下结果:
{'client1': [['c1', 'f1'], {'rec_1': ['t1', 's1']}, {'rec_2': ['t2', 's2']}],
'client2': [['c2', 'f2']]}
确定两个字典中的键名称相等时:
clientlist = dict([(k, [clientList[k], recordlist[k]]) for k in clientList])
就像这里:
>>> a = {1:1,2:2,3:3}
>>> b = {1:11,2:12,3:13}
>>> c = dict([(k,[a[k],b[k]]) for k in a])
>>> c
{1: [1, 11], 2: [2, 12], 3: [3, 13]}
这可能有效,但我不确定我是否理解您的数据结构规则
# join all the dicts for better lookup and update
clientDict = {}
for d in clientList:
for k, v in d.items():
clientDict[k] = clientDict.get(k, []) + v
recordDict = {}
for d in recordList:
for k, v in d.items():
recordDict[k] = recordDict.get(k, []) + [v]
for k, v in recordDict.items():
clientDict[k] = [clientDict[k]] + v
# I don't know why you need a list of one-key dicts but here it is
clientList = [dict([(k, v)]) for k, v in clientDict.items()]
对于您提供的示例数据,这给出了您想要的结果,希望能有所帮助。您想要的输出不是有效的Python…您有一个非常奇怪的数据结构,您能解释一下为什么要使用该数据结构吗?为什么要列一张单子,为什么不只是一张单子?这将使查找和更新更容易。@F.C.是的,我改变了这一点,谢谢你的评论。一个小小的改进是使用dict理解:
{k:[A[k],b[k]]A}中的k
@EyalFink,如果输入dict有重叠但不同的键怎么办?您的方法和Schuh的方法将引发KeyError
。你有解决办法吗?最好是理解。