Соответствующие значения в списках переменной длины, содержащих подсписки в python

Я пытаюсь перебрать словарь, в котором каждый ключ содержит список, который в свою очередь содержит от 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]

Что облегчило бы проверку того, находится ли одно значение в другом словаре, но тогда я теряю способность работать конкретно с подсписком, который содержал части повторяющихся значений, и при этом я не могу считать этот подсписок только один раз.

Желаемым результатом является счет 2 для ключа 1 и 1 для ключа 2, а также возможность обрабатывать соответствующие списки для дальнейшего анализа.

1 ответ

Решение

Вот одно из решений. Я сначала преобразовываю список списков в список наборов. Если у вас есть какой-либо контроль над списками, сделайте их наборы.

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))
Другие вопросы по тегам