我有两个长名单。我基本上想从这个列表中删除与condtion不匹配的元素。例如,
list_1=['a', 'b', 'c', 'd']
list_2=['1', 'e', '1', 'e']
列表一和二对应。现在我想删除列表中与我的条件不匹配的某些元素。我必须确保从列表2中删除相应的元素,并且顺序不会搞砸。
所以我创建了一个遍历列表1的for循环,并存储了必须删除的元素的所有索引。
让我们说:
index_list = ['1', '3']
基本上,我需要确保从列表1中删除b和d以及从列表2中删除e和e。我该怎么做?
我试过了:
del (list_1 [i] for i in index_list)]
del (list_2 [i] for i in index_list)]
但是我得到一个错误,索引必须是列表,而不是列表。我也尝试过:
list_1.remove[i]
list_2.remove[i]
但这也不起作用。我尝试创建另一个循环:
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)
但这也不起作用。它给了我一个错误,即e和j不是全局名称。
答案 0 :(得分:2)
试试这个:
>>> list_1=['a', 'b', 'c', 'd']
>>> list_2 = ['1', 'e', '1', 'e']
>>> index_list = ['1', '3']
>>> index_list = [int(i) for i in index_list] # convert str to int for index
>>> list_1 = [i for n, i in enumerate(list_1) if n not in index_list]
>>> list_2 = [i for n, i in enumerate(list_2) if n not in index_list]
>>> list_1
['a', 'c']
>>> list_2
['1', '1']
>>>
答案 1 :(得分:1)
怎么样:
list_1, list_2 = zip(*((x, y) for x, y in zip(list_1, list_2) if f(x)))
f
是一个测试list_1
中某个值是否符合您条件的函数。
例如:
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')
(请注意,此方法实际上会将list1
和list2
设置为元组,这可能适用于您的用例,也可能不适用。如果您确实需要将它们作为列表,那么您可以非常轻松地使用它们使用以下行将它们转换为列表:
list_1, list_2 = list(list_1), list(list_2)
紧跟在“主要”行之后。)
答案 2 :(得分:0)
你可以试试这个:
index_list.sort(reverse=True, key=int)
for i in index_list:
del(list_1[int(i)])
del(list_2[int(i)])
或者您也可以这样做:
list_1 = [item for item in list_1 if f(item)]
list_2 = [item for item in list_2 if f(item)]
其中f
是一个根据您的标准返回True / False的函数。在您的示例中,可以是def f(item): return item != 'a' and item != 'c' and item != 'e'
答案 3 :(得分:0)
派对有点晚了,但这是另一个版本。
list_1=['a', 'b', 'c', 'd']
list_2=['1', 'e', '1', 'e']
index_list = ['1', '3']
#convert index_list to int
index_list = [ int(x) for x in index_list ]
#Delete elements as per index_list from list_1
new_list_1 = [i for i in list_1 if list_1.index(i) not in index_list]
#Delete elements as per index_list from list_2
new_list_2 = [i for i in list_2 if list_2.index(i) not in index_list]
print "new_list_1=", new_list_1
print "new_list_2=", new_list_2
输出
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
new_list_1= ['a', 'c']
new_list_2= ['1', '1']
>>>