我有一个列表如下:
list = [ [1,2,3,4,5],
[1,2,3,3,5],
[1,2,3,2,5],
[1,2,3,4,6] ]
如果满足以下条件,我想解析这个列表并删除该条目:
list[i][0]
与list[i+1][0]
AND list[i][4]
与list[i+1][4]
将导致以下列表:
list = [ [1,2,3,4,5],
[1,2,3,4,6]]
非常感谢任何帮助。感谢。
编辑:使用Python 2.5.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])]