我有一个需要比较的多个词典列表。列表中的字典数量将根据查询结果而变化。
具有相同键但值不同的字典的示例列表:
test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
所需的输出:
[{'b':'1','c':'4'},{'b':'2','c':'5'},{'b':'3','c':'6'}]
我希望能够输出列表中的键(具有值)不同(如果有的话),如果没有输出空列表。
我尝试了这段代码,但它给了我那些具有相同值的代码。
mysets = (set(x.items()) for x in test)
print reduce(set.intersection, mysets)
输出:
{'a':'1'}
我也试过这个,但它只给了我第一本字典上的不同对。
def IntersectDicts( d1, d2 ) :
return dict(filter(lambda (k,v) : k in d2 and d2[k] != v, d1.items()))
result = reduce(IntersectDicts, test)
print result
输出:
{'b': '1', 'c': '4'}
答案 0 :(得分:0)
我写了两个解决方案来解决你的问题。
test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}] keys = set() def loop_solution(): for key,val in test[0].items(): for item in test[1:]: if item[key] != val: keys.add(key)
def is_duplicate_value(p_key,p_value): for item_dict in test: if item_dict[p_key] != p_value: return True return False def func_solution(): for key,val in test[0].items(): if is_duplicate_value(key,val): keys.add(key)
如果您不想调用其他功能,请选择第一个解决方案。但我会推荐第二种解决方案,因为它更具可读性。
答案 1 :(得分:0)
请尝试此代码
import copy
test = [{'a':'1','b':'1','c':'4'},{'a':'1','b':'2','c':'5'},{'a':'1','b':'3','c':'6'}]
ftest = copy.deepcopy(test)
keyy = ''
for d in range(len(test)):
ftest[d] = {}
for k, y in test[d].items():
for f in range(len(ftest)):
if k in ftest[f] and y == ftest[f].get(k):
keyy = k
ftest[f].pop(k)
test[f] = ftest[f]
if keyy:
test[d].pop(keyy)
keyy = ''
ftest = copy.copy(test)
print 'TESTINGGGGG ---------------------', test