Поиск элементов списка, содержащих ровно два вложенных элемента с одинаковыми значениями в python

#python #list #loops

#python #Список #циклы

Вопрос:

У меня есть список (A) с 2 вложенными элементами.

 A=[[[['a1', 'a1'], ['b1', 'b1'], ['c1', 'c2']],[['a1', 'a1'], ['b1', 'b1'], ['c1','c1']]], [[m], [1-m]]]
 

Элементы в A[1] ( [[m], [1-m]] ) — это «вероятности», связанные с элементами в A[0] , например [m] — это вероятность для A[0][0] [[‘a1’, ‘a1’], [‘b1’, ‘b1’], [‘c1’, ‘c2’]] .

Мне нужно найти способ добавить элементы из A[0], которые имеют только 2 вложенных элемента с одинаковыми значениями внутри, а также вероятность, связанную с этим элементом (найденным в A[1]), в новый список. Например, только первый элемент в [0] (т.е.. [['a1', 'a1'], ['b1', 'b1'], ['c1', 'c2']] ] имеет два внутренних элемента nest, внутри которых есть одно и то же ([a1, a1] и [b1, b1] ). Второй элемент A[0] имеет 3 внутренних элемента с одинаковыми значениями внутри, поэтому это не будет учитываться.

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

 B=[[['a1', 'a1'], ['b1', 'b1'], ['c1', 'c2']], [[m]]]
 

Я попытался решить это с помощью серии циклов for, подобных таким,

 for i in A[0]:
    for j in i:
        for k in i:
            if j[0]==j[1]:
                if k[0]==k[1]:
                    B=[]
                    B.append(i)
 

однако это выдает только A[0][1], который мне не нужен, и я также не уверен, как подойти к получению вероятностей в B. Любой ввод о том, как исправить код, был бы полезен.

Ответ №1:

Давайте напишем понимание списка, что-то вроде приведенного ниже.

  1. Он выполняет итерацию по sublist p паре и вероятности, заархивированной вместе ( zip(A[0], A[1] ), и возвращает только те подсписки, которые имеют ровно 2 пары одинаковых.
  2. Для второй части (условие if) мы перебираем каждую из пар i в sublist и проверяем set() , равна ли их длина после взятия a 1 . Если да, то они имеют повторяющиеся элементы.
  3. Далее мы суммируем логические значения для этого подсписка True=1 , False=0 . Если сумма равна 2 (существует ровно 2 True s), то подсписок содержит ровно 2 pairs with repeated elements и возвращается пониманием списка вместе с соответствующей вероятностью.
 m = 0.2

A=[[[['a1', 'a1'], ['b1', 'b1'], ['c1', 'c2']],[['a1', 'a1'], ['b1', 'b1'], ['c1','c1']]], [[m], [1-m]]]

[[sublist,p] for sublist,p in zip(A[0], A[1]) if sum([len(set(i))==1 for i in sublist])==2]
 
 [[[['a1', 'a1'], ['b1', 'b1'], ['c1', 'c2']], [0.2]]]
 

Комментарии:

1. Это идеально! Также спасибо за объяснение!

2. Добро пожаловать, рад помочь.