【问题标题】:Join two offset lists ("offset zip"?)加入两个偏移列表(“偏移 zip”?)
【发布时间】:2017-07-19 08:44:37
【问题描述】:

考虑两个列表,例如:

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 棋盘上的等级和文件。但总的来说,我认为这些列表的长度可能不同。

【问题讨论】:

    标签: python list python-3.x chess


    【解决方案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)]
    

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

    【讨论】:

    • 在我有两个简短列表的情况下,这可能有点奢侈,但我很欣赏您的答案的潜在可扩展性,如果我将来最终使用更大的列表,我会参考它 - 谢谢你非常喜欢!
    【解决方案2】:

    你可以做一些类似的事情

    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 索引生成更紧凑,但更清楚的是这种结构应该发生什么。

    【讨论】:

    • 这很清楚发生了什么——谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多