Как удалить элементы одной и той же позиции из трех списков, если отдельные условия не выполняются - PullRequest
1 голос
/ 30 марта 2019

У меня есть три кортежа, listA, listB и listC.

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

У меня есть два условия, одно для listA и одно для listB. Я хотел бы удалить все значения в listA, которые не удовлетворяют условию listA, и удалить все значения в listB, которые не удовлетворяют условиям listB, и чтобы все значения с такими же индексами эти удаленные значения во всех трех списках также удаляются.

Это будет включать удаление некоторых значений, которые удовлетворяют условиям listA из listA и т. Д., Если условие listB не выполняется. Таким образом, в результате получается три списка, все значения которых по отдельности удовлетворяют условию их собственного списка (хотя listC не имеет условия), и значения имеют такое же соединение, как и изначально.

Мне удалось сделать это путем перебора списка с использованием цикла for, пример того, как я это сделал, показан ниже, условие, наложенное на listA, равно x <10, а для listB - x> 20. Я знаю, что есть намного более изящные и питонные методы для этого с использованием zip и фильтрации, однако я до сих пор не смог заставить их работать. Я не очень опытный программист, поэтому любая помощь будет принята с благодарностью.

listA=(15,5,2,8,10,11,4,8) 
listB=(19,25,28,14,32,10,21,29)
listC=(0,9,13,4,19,51,83,13)

listAA=[]
listBB=[]
listCC=[]
for i in range(len(listA)):
    if listA[i]<10:
        if listB[i]>20:
            listAA.append(listA[i])
            listBB.append(listB[i])
            listCC.append(listC[i])
        else:
            continue
    else:
        continue
print(listAA,listBB,listCC)

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Если у вас есть несколько списков, которые соответствуют друг другу: zip они вместе и работают с zippes - затем снова застегните их, чтобы вернуться к вашим кортежам:

listA = (15,5,2,8,10,11,4,8)           # not a list - it is a tupe
listB = (19,25,28,14,32,10,21,29)      # not a list - it is a tupe
listC = (0,9,13,4,19,51,83,13)         # not a list - it is a tupe

#  create positional tuples, perform tests, reverse tupling, and decompose into tuples    
A,B,C = list(zip(*filter(lambda x:x[0]<10 and x[1]>20, zip(listA,listB,listC))))

print(A)
print(B)
print(C) 

Выход:

(5, 2, 4, 8)
(25, 28, 21, 29)
(9, 13, 83, 13)

Доку:


zip( [1,2,3],["a","b","c"],[99,88,77] ) => ((1,"a",99),(2,"b",88),(3,"c",77)) as generator
0 голосов
/ 30 марта 2019

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

Это говорит о том, что у вас действительно есть восемь элементовкаждый с тремя атрибутами.Было бы удобнее рассматривать каждый предмет как атомную единицу.Питонический подход для этого состоит в том, чтобы моделировать каждый элемент как кортеж (как три кортежа).Тогда у вас будет:

items = [(15, 19, 0),
         (5, 25, 9),
         (2, 28, 13),
         ...,
         (8, 29, 13)]

Теперь вам нужна вспомогательная функция, предикат, которая сообщит нам, соответствует ли элемент некоторым бизнес-правилам, приемлем ли элемент.

def is_wanted(item):
    """Predicate, true for an item we wish to retain."""
    price, length, age = item  # unpack the tuple
    return (price < 10
            and length > 20)

Имея это в виду, вы можете позвонить filter():

print(list(filter(is_wanted, items)))

Если вы хотите получить фантазию, вы можете использовать с именемкортеж .

...