【问题标题】:How to flatten a tuple in python如何在python中展平元组
【发布时间】:2013-09-01 06:32:47
【问题描述】:

我有一个列表的以下元素,该列表有 100 个元素。

[(50, (2.7387451803816479e-13, 219))]

如何将每个元素转换成这样?

[(50, 2.7387451803816479e-13, 219)]

【问题讨论】:

    标签: python list tuples flatten


    【解决方案1】:
    [(a, b, c) for a, (b, c) in l]
    

    Tuple packing and unpacking 解决了这个问题。

    【讨论】:

    • 答案中的链接究竟如何帮助解决这个问题?
    • 当您知道元组结构时,这很有效,但有时需要将其展平的原因是结构未知。例如np.where 可以返回具有单个值的元组或具有值列表的元组,在这种情况下,需要以不同的方式访问元组。这种情况如何处理?
    • @DanGoodrick:np.where 不这样做。元组从不包含列表;它始终是一个 numpy 数组的元组,除了 0 维数组的奇怪边缘情况外,数组的数量始终等于输入数组的维数。没有必要在不同的情况下以不同的方式访问元组,扁平化它没有多大意义。
    【解决方案2】:

    Python 3.5 中的新增功能,在PEP 448 中引入了额外的元组解包,您可以在元组文字中使用星号表达式,以便您可以使用

    >>> l = [(50, (2.7387451803816479e-13, 219)), (40, (3.4587451803816479e-13, 220))]
    >>> [(a, *rest) for a, rest in l]
    [(50, 2.738745180381648e-13, 219), (40, 3.458745180381648e-13, 220)]
    

    如果您有一个嵌套元组用于记录保存许多要展平的元素,这可能会很有用。

    【讨论】:

      【解决方案3】:

      您可以使用以下函数并将其循环应用到列表中的每个元素。

      def flatten(data):
          if isinstance(data, tuple):
              if len(data) == 0:
                  return ()
              else:
                  return flatten(data[0]) + flatten(data[1:])
          else:
              return (data,)
      

      它是如何工作的:

      • 首先会检查类型是否为元组,如果不是,则“元组”参数
      • 如果元组为空,则第二行返回一个空元组
      • 第三行取出第一个元素并递归调用函数

      这个解决方案的好处是:

      • 不必知道给定元组的结构
      • 元组可以任意嵌套深度
      • 适用于 Python 2.2+(可能更早)

      代码略微改编自以下来源:
      https://mail.python.org/pipermail/tutor/2001-April/005025.html

      希望它可以帮助某人:)

      【讨论】:

        【解决方案4】:

        对@sagacity 答案的改进,这将重新运行生成器,使用recursiveyieldtuple 展平。

        def flatten(data):
            if isinstance(data, tuple):
                for x in data:
                    yield from flatten(x)
            else:
                yield data
        

        要使其成为listtuple,请使用list()tuple()

        list(flatten_tuple(nested_tuple))
        tuple(flatten_tuple(nested_tuple))
        

        如果它需要在 Python 2 中工作,请将 yield from 替换为另一个循环:

        def flatten(data):
            if isinstance(data, tuple):
                for x in data:
                    for y in flatten(x):
                        yield y
            else:
                yield data
        

        【讨论】:

          【解决方案5】:

          这样就可以得到结果

          >> example =  [(50, (2.7387451803816479e-13, 219))]
          >>> [tuple(x[:1]) + (x[1]) for x in example] 
          [(50, 2.738745180381648e-13, 219)]
          

          【讨论】:

            【解决方案6】:

            一种与 Python 2.7 兼容的方式来执行 Mitch 为 Python 3.5 建议的操作。

            >>> example =  [(50, (2.7387451803816479e-13, 219)),
                        (100, (3.7387451803816479e-13, 218))]
            >>> [(lambda *x: x)(k, *r) for k, r in example]
            [(50, 2.738745180381648e-13, 219), (100, 3.7387451803816477e-13, 218)]
            

            这种方法的优点是您不必像接受的答案那样为内部元组的每个值找到一个变量名来展平。如果有两个或三个项目,那不是真正的问题,但想象一下有十分之一或更多的值......

            【讨论】:

              猜你喜欢
              • 2018-05-06
              • 1970-01-01
              • 1970-01-01
              • 2022-10-24
              • 2012-11-21
              • 1970-01-01
              • 1970-01-01
              • 2018-10-01
              • 2020-06-22
              相关资源
              最近更新 更多