我正在尝试遍历一个字典,其中每个键包含一个列表,该列表又包含0到20多个子列表。目标是遍历字典1的值,检查它们是否在字典2的任何子列表中用于相同的密钥,如果是,则向计数器添加+1,而不再考虑该子列表。
代码看起来有点像这样:
dict1={"key1":[[1,2],[6,7]],"key2":[[1,2,3,4,5,6,7,8,9]]}
dict2={"key1":[[0,1,2,3],[5,6,7,8],[11,13,15]],"key2":[[7,8,9,10,11],[16,17,18]]}
for (k,v), (k2,v2) in zip(dict1.iteritems(),dict2.iteritems()):
temp_hold=[]
span_overlap=0
for x in v:
if x in v2 and v2 not in temp_hold:
span_overlap+=1
temp_hold.append(v2)
else:
continue
print temp_hold, span_overlap
这显然不起作用,主要是由于代码无法通过列表和子列表进行分层检查,部分原因是可能是错误的迭代语法。我对嵌套循环和迭代的掌握并不是最好的,这使得这很痛苦。另一种选择是首先使用以下方法将子列表加入单个列表:
v=[y for x in v for y in x]
这样可以很容易地检查一个值是否在另一个字典中,但是我失去了专门处理子列表的能力,该子列表包含迭代的部分值,也不能只计算该子列表一次。
对于key1,所需的输出为2,对于key2为1,并且能够处理匹配的子列表以进行进一步分析。
答案 0 :(得分:0)
这是一个解决方案。我首先将列表转换为列表。如果您对列表有任何控制权,请将它们设置为。
def matching_sublists(dict1, dict2):
result = dict()
for k in dict1:
assert(k in dict2)
result[k] = 0
A = [set(l) for l in dict1[k]]
B = [set(l) for l in dict2[k]]
for sublistA in A:
result[k] += sum([1 for sublistB in B if not sublistA.isdisjoint(sublistB) ])
return result
if __name__=='__main__':
dict1={"key1":[[1,2],[6,7]],"key2":[[1,2,3,4,5,6,7,8,9]]}
dict2={"key1":[[0,1,2,3],[5,6,7,8],[11,13,15]],"key2":[[7,8,9,10,11],[16,17,18]]}
print(matching_sublists(dict1, dict2))