如何根据子列表中的值删除列表中的条目

时间:2013-04-04 08:43:27

标签: python list

我有一个列表如下:

list = [ [1,2,3,4,5], 
         [1,2,3,3,5], 
         [1,2,3,2,5], 
         [1,2,3,4,6] ]

如果满足以下条件,我想解析这个列表并删除该条目:

  1. 如果list[i][0]list[i+1][0] AND
  2. 相同
  3. 如果list[i][4]list[i+1][4]
  4. 相同

    将导致以下列表:

    list = [ [1,2,3,4,5],
             [1,2,3,4,6]]
    

    非常感谢任何帮助。感谢。

    编辑:使用Python 2.5.4

4 个答案:

答案 0 :(得分:3)

使用列表推导来保持与条件不匹配的所有内容:

[sublist for i, sublist in enumerate(yourlist)
    if i + 1 == len(yourlist) or (sublist[0], sublist[4]) != (yourlist[i+1][0], yourlist[i + 1][4])]

因此,允许任何最后一行,或者第一个和最后一个元素与下一行中的相同列不匹配的行。

结果:

>>> [sublist for i, sublist in enumerate(yourlist)
...     if i + 1 == len(yourlist) or (sublist[0], sublist[4]) != (yourlist[i+1][0], yourlist[i + 1][4])]
[[1, 2, 3, 2, 5], [1, 2, 3, 4, 6]]

答案 1 :(得分:0)

不太简洁的非列表理解版本。

list = [ [1,2,3,4,5], 
         [1,2,3,3,5], 
         [1,2,3,2,5], 
         [1,2,3,4,6] ]

output = []

for i, v in enumerate(list):
    if i +1 < len(list):
        if not (list[i][0] == list[i+1][0] and list[i][4] == list[i+1][4]):
            output.append(v)
    else:
        output.append(v)

print output

答案 2 :(得分:0)

只是在桌子上放一些itertools: - )

from itertools import izip_longest

l = [ [1,2,3,4,5], 
      [1,2,3,3,5], 
      [1,2,3,2,5], 
      [1,2,3,4,6] ]

def foo(items):
    for c, n in izip_longest(items, items[1:]):
        if not n or c[0] != n[0] or c[4] != n[4]:
            yield c

print list(foo(l))

<强>输出:

[[1, 2, 3, 2, 5], [1, 2, 3, 4, 6]]

如果您不介意这不起作用,请改为创建一个新的list

修改

由于您告诉我们您使用的是2.5.4,因此您可以使用以下方法代替izip_longest

# warning! items must not be empty :-)
def zip_longest(items):
    g = iter(items)
    next(g)
    for item in items:
        yield item, next(g, None)

答案 3 :(得分:0)

我认为列表理解最适合这段代码。

res = [value for index, value in enumerate(a) if not (index < len(a)-1 and value[0]==a[index+1][0] and value[4]==a[index+1][4])]