#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:
Давайте напишем понимание списка, что-то вроде приведенного ниже.
- Он выполняет итерацию по
sublist
p
паре и вероятности, заархивированной вместе (zip(A[0], A[1]
), и возвращает только те подсписки, которые имеют ровно 2 пары одинаковых. - Для второй части (условие if) мы перебираем каждую из пар
i
вsublist
и проверяемset()
, равна ли их длина после взятия a 1 . Если да, то они имеют повторяющиеся элементы. - Далее мы суммируем логические значения для этого подсписка
True=1
,False=0
. Если сумма равна 2 (существует ровно 2True
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. Добро пожаловать, рад помочь.