Удаление списка в списке по критериям с помощью numpy - PullRequest
2 голосов
/ 31 марта 2019

У меня есть список со списками, которые выглядят так:

c = [[1,0,1], [2,3,1], [0,0,0]]

Я сделал функцию toss_non_G2(potential_list), которая выглядит примерно так:

def  toss_non_G2(potential_list):
    for list in potential_list:
        if any(x not in [0,1] for x in list):
            potential_list.remove(list)
    return potential_list

Я попробовал:

print(toss_non_G2(c))
>>> [[1, 0, 1], [0, 0, 0]]

Как я и ожидал. Но затем я проверил это на чем-то более сложном, и, следовательно, проблема :

import numpy as np
from scipy.linalg import solve

A = [[0.8760162 , 0.0571752 , 0.43403856], [0.04730946, 0.56278686, 0.05767958], [0.95880316, 0.9595227 , 0.02226051]]

b_list = [[1, 0, 1], [1, 1, 1]]

x_list = list()
for b in b_list:
    x = solve(A, b)
    x_list.append(x)

print(toss_non_G2(x_list))
>>> [array([-0.52792558,  1.49611693,  3.17236923])]

В этом случае я ожидал пустой список. Почему не удаляются все списки со значениями, отличающимися от 0 или 1, как в операторе if? Это как-то связано со списком, являющимся массивом numpy?

1 Ответ

1 голос
/ 01 апреля 2019

Изменение списка, по которому вы перебираете, - плохая идея.

Вместо удаления массивов, которые не удовлетворяют вашему условию, просто верните список, массивы которого удовлетворяют вашему условию:

def  toss_non_G2(potential_list):
    return [l for l in potential_list if all(x in [0,1] for x in l)]

При необходимости см. Документацию для all () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...