在Python中压缩列表的特定元素

时间:2014-06-03 16:26:50

标签: python list python-imaging-library

我有一个如下所示的列表:

[[(0, 0), (0, 500), (0, 1000)],
[(500, 0), (500, 500), (500, 1000)],
[(1000, 0), (1000, 500), (1000, 1000)]]

我需要它看起来像这样:

[[(0, 0), (500, 500)],
[(0, 500), (500, 1000)],
[(500, 0), (1000, 500)],
[(500, 500), (1000, 1000)]]

请注意,忽略第一个列表的最后一个元素,就像上一个列表的第一个元素一样。

这些是Pillow中图像裁剪的坐标。 (0,0)和(500,500)是段的左上角和右下角的坐标。 我已经工作了几个小时试图解决这个问题,但不能。 非常感谢帮助。

2 个答案:

答案 0 :(得分:4)

dat = [[(0, 0), (0, 500), (0, 1000)],
[(500, 0), (500, 500), (500, 1000)],
[(1000, 0), (1000, 500), (1000, 1000)]]

new_dat = []
for i in range(0,len(dat)-1):
    new_dat += zip(dat[i][:len(dat)-1], dat[i+1][1:])

print new_dat

打印:

[((0, 0), (500, 500)), ((0, 500), (500, 1000)), ((500, 0), (1000, 500)), ((500, 500), (1000, 1000))]

额外缩进:

[((0, 0), (500, 500)),
 ((0, 500), (500, 1000)),
 ((500, 0), (1000, 500)),
 ((500, 500), (1000, 1000))]

答案 1 :(得分:1)

为了创建复杂的迭代器,我发现使用生成器函数可以极大地简化问题:

L = [[(0, 0), (0, 500), (0, 1000)],
[(500, 0), (500, 500), (500, 1000)],
[(1000, 0), (1000, 500), (1000, 1000)]]

def pair_generator(it):
  it = iter(it)
  item0 = next(it)
  for item1 in it:
    yield [item0[0],item1[1]]
    yield [item0[1],item1[2]]
    item0 = item1

result = list(pair_generator(L))

print result