I have two long lists. I basically want to remove elements from this list that do not match a condtion. For example,
list_1=['a', 'b', 'c', 'd']
list_2=['1', 'e', '1', 'e']
List one and two correspond to each other. Now I would like to remove certain elements from list one that do not match my condition. I have to make sure that I remove the corresponding elements from list 2 and the order does not mess up.
So I created a for loop that goes through list 1 and stores all the indices of elements that have to be removed.
Let’s say:
index_list = ['1', '3']
Basically, I need to make sure I remove b and d from list 1 and e and e from list 2. How do I do this?
I tried:
del (list_1 [i] for i in index_list)]
del (list_2 [i] for i in index_list)]
But I get an error that indices has to be a list, not list. I also tried:
list_1.remove[i]
list_2.remove[i]
But this does not work either. I tried creating another loop:
for e, in (list_1):
for i, in (index_list):
if e == i:
del list_1(i)
for j, in (list_2):
for i, in (index_list):
if j == i:
del list_2(i)
But this does not work either. It gives me an error that e and j are not global names.
How about:
list_1, list_2 = zip(*((x, y) for x, y in zip(list_1, list_2) if f(x)))
Where f
is a function that tests whether a certain value in list_1
matches your condition.
For example:
list_1 = ['a', 'b', 'c', 'd']
list_2 = ['1', 'e', '1', 'e']
def f(s):
return s == 'b' or s == 'c'
list_1, list_2 = zip(*((x, y) for x, y in zip(list_1, list_2) if f(x)))
print list_1
print list_2
('b', 'c')
('e', '1')
(Note that this method actually makes list1
and list2
into tuples, which may or may not be okay for your use case. If you really need them to be lists, then you can very easily convert them to lists with the line:
list_1, list_2 = list(list_1), list(list_2)
right after the "primary" line.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With