从两个同步列表中删除相同位置(索引)的项目?

时间:2012-04-02 10:31:09

标签: python

我有两个清单:

l1 = ['#', '1', '#', '!']
l2 = ['S', 'T', 'K', 'M']

如果l1中有'#'我想删除它,并删除l2中相同位置的任何内容。 这是我尝试过的(在其他几个方面):

for i in range(len(li[j])):
    for k in range(len(l2[n])):
        if j == "#":
            li.remove([j][i])
            l2.remove([n][k])

但它抱怨j没有定义。 我希望结果看起来像这样:

l1 = ['1', '!']
l2 = ['T', 'M']

我很感激你的建议!

3 个答案:

答案 0 :(得分:6)

>>> l1 = ['#', '1', '#', '!']
>>> l2 = ['S', 'T', 'K', 'M']

>>> l1,l2 = zip(*((x,y) for x,y in zip(l1,l2) if x!='#'))
>>> l1
('1', '!')
>>> l2
('T', 'M')  

使用filter

>>> l1,l2 = zip(*filter(lambda x: '#' not in x,zip(l1,l2)))
>>> l1
('1', '!')
>>> l2
('T', 'M')

使用itertools

>>> from itertools import compress
>>> l1,l2 = zip(*compress(zip(l1,l2),(x!='#' for x in l1)))
>>> l1
('1', '!')
>>> l2
('T', 'M')

答案 1 :(得分:1)

这是一个简单易懂的方法:

a = ["#", "1", "#", "2", "3", "#"]
b = ["a", "b", "c", "d", "e", "f"]

a,b = zip(*[[a[i], b[i]] for i in range(len(a)) if a[i]!="#"])
print a
print b

我个人觉得比@jamylak提出的方法更容易理解和更有效(阅读:“更快”)。

输出:

>>> 
('1', '2', '3')
('b', 'd', 'e')

答案 2 :(得分:0)

由于您总是在两个列表中访问相同的索引,因此一个循环就足够了,但是当列表的长度不同时,您需要小心。

此外,在迭代时从列表中删除容易出错,以下解决方案将所有索引存储在删除列表中,并在第二次删除时从两个列表中删除索引:

l1 = ['#', '1', '#', '!']    
l2 = ['S', 'T', 'K', 'M']
remove = []
for i in range(len(l1) - 1):
    if l1[i] == '#':
        remove.insert(0, i)

for i in remove:
    l1.pop(i)
    l2.pop(i)

for i in l1:
    print i
for i in l2:
    print i