0

我有一个如下列表:

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

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

  1. if与ANDlist[i][0]相同list[i+1][0]
  2. 如果list[i][4]list[i+1][4]

这将导致以下列表:

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

任何帮助深表感谢。谢谢。

编辑:使用 Python 2.5.4

4

4 回答 4

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]]
于 2013-04-04T08:46:42.963 回答
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
于 2013-04-04T08:55:20.100 回答
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)
于 2013-04-04T08:59:57.183 回答
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])]
于 2013-04-04T09:42:39.237 回答