从列表中删除项目

时间:2015-08-07 15:30:37

标签: python list

我想将两个序列放入(x,y)坐标列表中。

seq1 = "11-345"
seq2 = "122--5"

我想删除包含' - '的任何(x,y)对。所以我写了一个简单的for循环,但它并没有删除所有的对。如果有多个' - '彼此相邻,则有些不会被删除。

z = zip(seq1, seq2)
for (x, y) in z:
    if x == '-' or y == '-':
        z.remove((x, y))

在这个例子中,它给了我z = [('1', '1'), ('1', '2'), ('3', '-'), ('5', '5')] 有时只会删除第一个,有时是最后一个,具体取决于顺序。关于为什么或如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

要提高性能,可以同时使用列表推导和迭代器而不是元组列表

from itertools import izip
z = [ (x, y) for x, y in izip(seq1, seq2) if x != "-" and y != "-" ]

答案 1 :(得分:1)

你错过了一个,因为你在迭代它的过程中修改了列表。就像删除索引2一样,迭代器从索引2移动到索引3,将元素3移动到刚刚传递的位置2。如果您按照自己的方式进行打印,可以看到它跳过(3, '-')(5, 5),因为您直接删除了元素:

for (x,y) in z:
  print(x, y)
  if x == '-' or y == '-':
    z.remove((x, y))

('1', '1')
('1', '2')
('-', '2')
('4', '-')

使用列表推导来创建新列表,避免出现问题。

for z in [(x, y) for x, y in zip(seq1, seq2) if x != '-' and y != '-']:
  print z

('1', '1')
('1', '2')
('5', '5')

答案 2 :(得分:0)

使用创建整个数组副本的切片表示法:

seq1 = "11-345"
seq2 = "122--5"

z = zip(seq1, seq2)
for (x, y) in z[:]:
    if x == '-' or y == '-':
        z.remove((x, y))