加入两个偏移列表(“offset zip”?)

时间:2017-07-19 08:44:38

标签: python list python-3.x chess

考虑两个列表,例如:

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
M = [1, 2, 3, 4, 5, 6, 7, 8]

假设我们给出了一对必须匹配的元素 - 例如(d, 6)。是否可以在这些元素上“对齐”列表,然后加入两个列表中仍有元素的列表 - 有点像拉链和内部连接之间的交叉?

这可能是最好的例子。如上所述使用LM

  • (d, 6)会导致[(a, 3), (b, 4), (c, 5), (d, 6), (e, 7), (f, 8)]
  • (h, 2)会导致[(g, 1), (h, 2)]
  • (a, 8)会导致[(a, 8)]

我的背景:我目前正在尝试建立一个能够通过阅读国际象棋符号来学习下棋的神经网络。这个问题与检查板上的对角线以更新件位置有关。例如,如果白色主教刚刚移动到b7(从棋盘右下角开始的一个方格)那么它必须来自h1-a8长对角线上的正方形或来自a6-c8上的正方形短对角线。

所以在我的情况下,LM的长度相同,因为它们对应于8×8棋盘上的等级和文件。但总的来说,我认为这些列表可能有不同的长度。

2 个答案:

答案 0 :(得分:1)

这是一种方法,在前向顺序中首先在两个列表上使用itertools.dropwhile,然后在两个列表中的连接项之前和之后反转项目。

然后链接两个结果的迭代,但是在使用itertools.islice从其中一个迭代中删除连接点后没有:

from itertools import dropwhile, islice, chain

def func(x, y, lst1, lst2):
    f1 = lambda i: i!=x
    f2 = lambda i: i!=y
    r =  zip(dropwhile(f1, lst1), dropwhile(f2, lst2))
    q  = reversed(zip(dropwhile(f1, reversed(lst1)), dropwhile(f2, reversed(lst2))))
    return list(chain(q, islice(r, 1, None)))

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
M = [1, 2, 3, 4, 5, 6, 7, 8]

print(func('d', 6, L, M))
# [('a', 3), ('b', 4), ('c', 5), ('d', 6), ('e', 7), ('f', 8)]

print(func('h', 2, L, M))
# [('g', 1), ('h', 2)]

print(func('a', 8, L, M))
# [('a', 8)]

在两个列表上进行两次传递可能效率不高,但是懒人评估可以处理大型列表。

答案 1 :(得分:1)

你可以按照

的方式做点什么
L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
M = [1, 2, 3, 4, 5, 6, 7, 8]
m = L.index('h')
n = M.index(2)
if m > n:
  m, n = (m - n), 0
else:
  m, n = 0, (n - m)
print(list(zip(L[m:], M[n:])))

PS你可能会使m,n索引生成更紧凑但是更清楚这个结构应该发生什么。