匹配包含python中的子列表的可变长度列表中的值

时间:2014-12-09 19:48:16

标签: python dictionary sublist

我正在尝试遍历一个字典,其中每个键包含一个列表,该列表又包含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,并且能够处理匹配的子列表以进行进一步分析。

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))