Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试元组列表之间的差异并构造结果dict_Python_Dictionary - Fatal编程技术网

Python 测试元组列表之间的差异并构造结果dict

Python 测试元组列表之间的差异并构造结果dict,python,dictionary,Python,Dictionary,我有两个元组列表,其中元组[0]是唯一的\u id,而元组[1]是我要在匹配唯一\u id的元组之间进行比较的值。这些列表的长度可能不同,但元组的格式相同 list1 = [(uid,value1,value2),...] list2 = [(uid,value1,value2),...] 我怎样才能最好地找到字典: {uid:value1,...} 如果uid匹配但value1不匹配,则使用列表2中的value1填充dict 例如: list1 = [(1,A,z),(2,B,y),(3,

我有两个元组列表,其中元组[0]是唯一的\u id,而元组[1]是我要在匹配唯一\u id的元组之间进行比较的值。这些列表的长度可能不同,但元组的格式相同

list1 = [(uid,value1,value2),...]
list2 = [(uid,value1,value2),...]
我怎样才能最好地找到字典:

{uid:value1,...}
如果uid匹配但value1不匹配,则使用列表2中的value1填充dict

例如:

list1 = [(1,A,z),(2,B,y),(3,C,z),(4,D,w),(6,F,x)]
list2 = [(1,G,z),(2,B,x),(3,D,q),(5,F,z)]

result = {1:G,3:D}
我迄今为止的努力:

dict1 = {tup[0]:tup[1:] for tup in list1}
dict2 = {tup[0]:tup[1:] for tup in list2}

result = {}
for k in set(dict1) & set(dict2):
  if dict1[k][0] != dict2[k][0]:
    result[k] = dict2[k][0]

我希望有一种更有效或更干净的方法来获得结果。

假设列表按uid排序且长度相同,这应该可以:

list1 = [(1,'A','z'),(2,'B','y'),(3,'C','z'),(4,'D','w')]
list2 = [(1,'G','z'),(2,'B','x'),(3,'D','q'),(5,'F','z')]

result = {k2 : v2 for (k1, v1, _), (k2, v2, _) in zip(list1, list2) if k1 == k2 and v1 != v2}

print(result)
输出

{1: 'G', 3: 'D'}
{1: 'G', 3: 'D'}
如果上述条件不成立,您可以执行以下操作:

list1 = [(1, 'A', 'z'), (2, 'B', 'y'), (3, 'C', 'z'), (4, 'D', 'w')]
list2 = [(1, 'G', 'z'), (2, 'B', 'x'), (3, 'D', 'q'), (5, 'F', 'z')]

d1 = {k1: v1 for k1, v1, _ in list1}
d2 = {k2: v2 for k2, v2, _ in list2}

result = {k2: v2 for k2, v2 in d2.items() if k2 in d1 and d1[k2] != v2}
print(result)
输出

{1: 'G', 3: 'D'}
{1: 'G', 3: 'D'}

列表的长度不一定相同,抱歉。@J.Flann那么第二个解决方案就可以了。看起来不错。你能解释一下前两个听写理解中的u的目的吗?如果元组较长,此解决方案是否有效?@J.Flann
\uucode>告诉python,在这种情况下,您希望元组的大小为3,但不打算使用第三个元素的值。