python - 加入两个偏移量列表 ("offset zip"?)

标签 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)。是否可以在这些元素处“对齐”列表,然后在两个列表中仍有元素的情况下加入列表 - 有点像 zip 和内部连接之间的交叉?

这可能最好用例子来说明。如上所述使用 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 棋盘上的行列和文件。但总的来说,我认为列表的长度可能不同。

最佳答案

这是一种使用 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)]

对两个列表进行两次传递可能不是很有效,但是惰性求值可以处理大型列表。

关于python - 加入两个偏移量列表 ("offset zip"?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45185354/

相关文章:

python - 读取大型制表符分隔文件分块时出现异常

python-3.x - 如何在执行使用 pyinstaller 创建的 exe 文件时在我的 tkinter 窗口而不是 CMD 窗口上获取 python 控制台日志

python - 如何使用正则表达式将所有重复的标点符号替换为单个标点符号?

python - Dataframe 加入空安全条件使用

python - 使用图形 API 编写代码

java - 如何将List保存到SQL数据库中?

python - 在没有排序功能的情况下在python中对列表进行排序

python - 我想知道 python 的 re lib 中正则表达式匹配的最后一个索引

python - Django PyTest - 不允许数据库访问即使使用 django_db 和装置也会出错?

MySQL逗号分隔字段查询