代码之家  ›  专栏  ›  技术社区  ›  rlbond

在Python中将元组添加到元组列表中

  •  18
  • rlbond  · 技术社区  · 16 年前

    我是python新手,不知道最好的方法。

    下面是一些代码:

    offsets = [( 0, 0),( 0,-1),( 0, 1),( 1, 0),(-1, 0)]
    points = [( 1, 5),( 3, 3),( 8, 7)]
    

    [( 1, 5),( 1, 4),( 1, 6),( 2, 5),( 0, 5),
     ( 3, 3),( 3, 2),( 3, 4),( 4, 3),( 2, 3),
     ( 8, 7),( 8, 6),( 8, 8),( 9, 7),( 7, 7)]
    

    我不能使用NumPy或任何其他库。

    4 回复  |  直到 16 年前
        1
  •  33
  •   John Kugelman Michael Hodel    16 年前
    result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets]
    

    有关更多信息,请参阅 list comprehensions

        2
  •  15
  •   Joel Bender    16 年前

    非常简单:

    >>> rslt = []
    >>> for x, y in points:
    ...     for dx, dy in offsets:
    ...         rslt.append( (x+dx, y+dy) )
    ... 
    >>> rslt
    [(1, 5), (1, 4), (1, 6), (2, 5), (0, 5), (3, 3), (3, 2), (3, 4), (4, 3), (2, 3), (8, 7), (8, 6), (8, 8), (9, 7), (7, 7)]
    

    循环遍历点和偏移,然后构建向点添加偏移的新元组。

        3
  •  8
  •   Alex Martelli    16 年前

    就个人而言,我喜欢阿洛克的答案。然而,对于电影迷来说 itertools ,基于itertools的等价物(在Python 2.6及更高版本中)是:

    import itertools as it
    ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)]
    

    但是,在这种情况下,itertools解决方案是 比简单的要快(实际上有点慢,因为它需要将每个 x, y x、 y 但只有一次)。尽管如此,在其他情况下,itertools.product仍然是嵌套循环的优秀替代品,因此,值得了解它!)

        4
  •  5
  •   John Machin Santi    16 年前

    如果您不关心结果中的重复项:

    result = []
    for ox, oy in offsets:
        for px, py in points:
            result.append((px + ox, py + oy))
    

    result = set()
    for ox, oy in offsets:
        for px, py in points:
            result.add((px + ox, py + oy))