【问题标题】:Python generate and return tuples in a non-list formPython 以非列表形式生成和返回元组
【发布时间】:2016-09-04 08:19:20
【问题描述】:
def tuple_gen(x, y, num):
    pos = []
    for i in range(num):
        x += 1
        pos.append([x, y])
        pos[i] = tuple(pos[i])
    return pos

我的输入是:

>>> tuple_gen(0,1,5)
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

我想要的是返回元组而不是列表:

>>> tuple_gen(0,1,5)
(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)

因为我想形成一个包含不同类型元组的列表:

>>> [tuple_gen(0,1,5), tuple_gen(0,2,6)]
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2)]

我想要一个简洁明了的解决方案。

*请注意,我不想使用任何 extendappend 来合并这些列表,因为我需要很多元组

【问题讨论】:

  • 真的需要最终的巨型列表吗?制作一个产生所有你想要的元组的迭代器可能会更好。顺便说一句,您当前版本的 tuple_gen 可以通过简单的单行列表理解来完成。

标签: python arrays list tuples


【解决方案1】:

您当前正在返回一个元组列表:

>>> tuple_gen(0,1,5)
[(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]

您可以使用return tuple(pos) 返回一个元组。

这是您要求的,但对于此用例无济于事:

[tuple_gen(0,1,5), tuple_gen(0,2,6)]

这仍然是一个由两个元组组成的列表。

您真正需要的是返回一个列表,然后再将这些列表连接起来:

tuple_gen(0,1,5) + tuple_gen(0,2,6)

【讨论】:

    【解决方案2】:

    你不能完全按照你说的那样做,但是你有一些选择,首先是链接你的函数的结果:

    >>> a = [(1, 1), (2, 1)]
    >>> b = [(3, 1), (4, 1), (5, 1)]
    >>> 
    >>> a + b
    [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
    >>> # Or using itertools.chain
    >>> from itertools import chain
    >>> 
    >>> list(chain(a, b))
    [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
    

    其次,如果你在python3.5+,你可以使用高级解包:

    >>> a = [(1, 1), (2, 1)]
    >>> b = [(3, 1), (4, 1), (5, 1)]
    >>> [*a, *b]
    [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]
    

    您可以执行哪些功能:

    [*tuple_gen(0,1,5), *tuple_gen(0,2,6)]
    

    【讨论】:

      【解决方案3】:

      您需要一个容器来保存您的元组。您正在考虑像元组这样的列表或方案,它们是链表。 python 中的元组在创建、加入和追加方面是昂贵的。您应该为此目的使用列表。您可以列出一个列表,然后加入它。

      tuple_gen(0,1,5) + tuple_gen(0,2,6)
      

      或者你可以在你的 gen 函数之外加入你的元组。

      def tuple_gen(x, y, num):
          for i in range(num):
              x += 1
              yield (x,y)
      
      x = []
      for i in tuple_gen(0,1,5):
          x.append(i)
      
      for i in tuple_gen(0,2,6):
          x.append(i)
      

      python 还有其他容器——甚至是链表。几乎所有都实现为带有一些附加功能的列表。

      【讨论】:

        【解决方案4】:

        您只需要更改呼叫tuple_gen 的方式。这是一个示例,稍微改进了tuple_gen

        def tuple_gen(x, y, num):
            pos = []
            for i in range(num):
                x += 1
                pos.append((x, y))
            return pos
        
        bases = (
            (0, 1, 5), 
            (0, 2, 6),
        )
        
        a = [t for args in bases for t in tuple_gen(*args)] 
        print(a)
        

        输出

        [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2)]
        

        另一种方法是创建一个产生所有所需元组的生成器:

        def make_tuples(bases):
            for x, y, num in bases:
                yield from ((i, y) for i in range(x + 1, num + x + 1))
        
        bases = (
            (0, 1, 5), 
            (0, 2, 6),
        )
        
        a = list(make_tuples(bases))
        print(a)
        

        根据您的实际需要,您可以避免创建列表(从而节省 RAM),而只需在创建元组时使用它们。例如,

        for t in make_tuples(bases):
            print(t)
        

        输出

        (1, 1)
        (2, 1)
        (3, 1)
        (4, 1)
        (5, 1)
        (1, 2)
        (2, 2)
        (3, 2)
        (4, 2)
        (5, 2)
        (6, 2)
        

        【讨论】:

          猜你喜欢
          • 2020-12-16
          • 2017-06-10
          • 2020-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多