У меня есть два списка A
и B
. Я удаляю элемент из A
, который меньше tol
. Но я также хочу удалить элемент из B
, соответствующий удаленному элементу из A
. Например, [[2.22105075e-18]]
был удален из A
. В соответствии с этим [[4,13]]
следует удалить из B
. Я представляю текущий и ожидаемый результат.
import numpy as np
A= [[9.16435586e-05], [0.000184193464], [9.28353239e-05], [2.22105075e-18]]
B= [[13, 14], [4, 5], [5, 14], [4, 13]]
tol=1e-12
CA=[[x[0]] for x in A if x[0]>tol]
CB=[x for x,y in enumerate(CA) if list(y) in B]
print(CB)
Текущий выход
[]
Ожидаемый результат
[[13, 14], [4, 5], [5, 14]]
Вы можете обрабатывать их параллельно с помощью zip:
CA, CB = map(list, zip(*((a, b) for a, b in zip(A, B) if a[0]>tol)))
# or
# CA, CB = map(list, zip(*(x for x in zip(A, B) if x[0][0]>tol)))
Выход:
# CA
[[9.16435586e-05], [0.000184193464], [9.28353239e-05]]
# CB
[[13, 14], [4, 5], [5, 14]]
А если A=[]
, B=[]
? В этом случае я хочу CA, CB=[]
, но получаю ошибку: ValueError: not enough values to unpack (expected 2, got 0)
.
Тогда лучше всего будет внешняя проверка if A: … else: CA, CB = [], []
Извини, я не слежу за тобой. Можно ли обновить ответ, если A, B=[]
?
Основная идея для достижения заявленной цели заключается в следующем:
A
и B
с zip
, чтобы получить пары вида (a, b)
.a b
, которые удовлетворяют предикату на a
.Мы можем реализовать это несколькими способами.
A= [[9.16435586e-05], [0.000184193464], [9.28353239e-05], [2.22105075e-18]]
B= [[13, 14], [4, 5], [5, 14], [4, 13]]
tol=1e-12
result = [b for a,b in zip(A, B) if a[0]>tol]
result = []
for i in range(len(A)):
if A[i][0] > tol:
result.append(B[i])
Оба метода по существу реализуют изложенный алгоритм.
Почему вы импортируете NumPy, когда у вас есть только списки?