【问题标题】:How can I turn two lists of equal lengths into a list of nested lists that represent ordered pairs?如何将两个相等长度的列表转换为表示有序对的嵌套列表列表?
【发布时间】:2017-12-15 22:20:25
【问题描述】:

例如,如果这是我的两个列表:

a=[1,2,3,4,5]
b=[6,7,8,9,10]

那么我想做的就是想办法得到:

c=[[1,6],[2,7],[3,8],[4,9],[5,10]]

抱歉,可能是基本问题。如果有区别,这些是 numpy 数组。

【问题讨论】:

标签: python list python-3.x numpy nested-lists


【解决方案1】:

如果您想要一个 numpy 数组作为结果,您可以使用 array.T 构建它:

In [15]: a=np.array([1,2,3,4,5])

In [16]: b=np.array([6,7,8,9,10])

In [17]: np.array([a,b]).T
Out[17]: 
array([[ 1,  6],
       [ 2,  7],
       [ 3,  8],
       [ 4,  9],
       [ 5, 10]])

参考:What is the equivalent of "zip()" in Python's numpy?

【讨论】:

    【解决方案2】:

    一种方法是使用列表理解和zip

    >>> [[i, j] for i, j in zip(a,b)]
    [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
    

    【讨论】:

      【解决方案3】:

      我不使用 numpy,但可能使用 zip:

      >>> a=[1,2,3,4,5]
      >>> b=[6,7,8,9,10]
      >>> list(zip(a,b))
      [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
      

      它返回一个元组列表。

      【讨论】:

        【解决方案4】:

        只需使用np.transpose:

        >>> np.transpose([a, b])
        array([[ 1,  6],
               [ 2,  7],
               [ 3,  8],
               [ 4,  9],
               [ 5, 10]])
        

        如果您希望结果为列表,只需在之后调用tolist()

        >>> np.transpose([a, b]).tolist()
        [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
        

        【讨论】:

          【解决方案5】:
          d = []
          for i in range(0, 5):
              d.append([a[i], b[i])
          

          是一种使用元素对创建新二维列表的简单方法。正如其他人指出的那样使用 zip() 函数也是可行的。

          【讨论】:

            【解决方案6】:

            我很确定有比这更简单或更 Pythonic 的方式。

            c = [list(x) for x in zip(a,b)]

            这会输出一个列表列表,而不是仅仅输出一个元组列表的list(zip(a,b)。这结合了列表理解和 zip

            也避免了[[i,j] for i,j in zip(a,b)]的元组解包

            不知道什么更有效

            zip(*iterables) 创建一个迭代器,用于聚合来自每个可迭代对象的元素。

            https://docs.python.org/3/library/functions.html#zip

            【讨论】:

              【解决方案7】:

              有多种方法可以做到这一点。

              a = [1, 2, 3, 4, 5]
              b = [6, 7, 8, 9, 10]
              

              如果你只需要访问元素而不是修改它们,你可以使用zip函数:

              zip(a, b)
              >[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
              

              如果您确实需要一个列表列表,那么您可以使用列表推导:

              [[a[i], b[i]] for i in range(len(a))]
              >[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
              

              最后,如果您需要一个 numpy 数组作为结果,请使用 Transpose 函数:

              import numpy as np
              np.concatenate([[a], [b]]).T
              >array([[1, 6],
                      [2, 7],
                      [3, 8],
                      [4, 9],
                      [5, 10]])
              

              【讨论】:

                【解决方案8】:

                这会给你你想要的。

                a = [1,2,3,4,5]
                b = [6,7,8,9,10]
                c = [list(x) for x in zip(a, b)]
                

                【讨论】:

                • 看起来这将返回一个元组列表而不是列表列表,但可以使用map 修改它,不确定是否是最好的方法,但是:list(map(list, zip(a, b))) 效果很好。
                • @ViníciusAguiar 你说得对,我认为最简单的pythonic方法就是像c = [list(x) for x in zip(a, b)]这样的列表理解
                【解决方案9】:

                没有库,您可以使用:

                a = [1,2,3,4,5]
                b = [6,7,8,9,10]
                c = [[a[i],b[i]] for i in range(len(a))]
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-04-26
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-11-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-11-12
                  相关资源
                  最近更新 更多