Соответствующие значения в списках переменной длины, содержащих подсписки в 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))