Python:转换元组列表

2024-05-21 08:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我的数据结构如下:

[[ tuple11,
   tuple12,
   ... ],
 [ tuple21,
   tuple22,
   ... ],
 ...]

也就是说,外部列表可以有任意数量的元素,并且每个元素(列表)可以包含任意数量的元素(元组)。如何将其转换为:

[[ tuple11,
   tuple21,
   ... ],
 [ tuple12,
   tuple22,
   ... ],
 ... ]

对于外部列表中的两个元素,我有以下解决方案,但我不知道如何推广:

map(lambda x, y: [x, y], *the_list)

新增:

更详细地说,上面的每个元组实际上是两个np.array的元组

如果我从以下数据结构开始:

[[(array([111, 111]), array([121, 121])),
  (array([112, 112]), array([122, 122])),
  (array([131, 131]), array([141, 141])),
  (array([132, 132]), array([142, 142]))],
 [(array([211, 211]), array([221, 221])),
  (array([212, 212]), array([222, 222])),
  (array([231, 231]), array([241, 241])),
  (array([232, 232]), array([242, 242]))]]

我需要把它变成:

[[(array([111, 111]), array([121, 121])),
  (array([211, 211]), array([221, 221]))],
 [(array([112, 112]), array([122, 122])),
  (array([212, 212]), array([222, 222]))],
 [(array([131, 131]), array([141, 141])),
  (array([231, 231]), array([241, 241]))],
 [(array([132, 132]), array([142, 142])),
  (array([232, 232]), array([242, 242]))]]

请注意,对于任何正N,数组并不总是1✕2而是1✕N。每个元组中总是有两个数组,但每个内部列表中有任意数量的元组,外部列表中有任意数量的这些内部列表。你知道吗

我非常习惯于处理NumPy数组,但是我对本地列表、元组等方面的经验很少


Tags: thelambda元素数据结构map列表数量数组
2条回答

我似乎找到了解决办法。我不认为它优雅,但至少它似乎工作。让我们调用元组列表的原始列表main_list和元组列表的转换列表new_list

def transform_coeff_struct(main_list):

    new_list = []
    for ii, inner_list in enumerate(main_list):
        for jj, some_tuple in enumerate(inner_list):
            if ii==0:
                new_list.append([some_tuple,])
            else:
                new_list[jj].append(some_tuple)
    return new_list

您需要列,因此可以使用zip函数:

zip(*main_list)

但是,由于它以元组格式返回列(如果您只需要list),因此可以使用map将它们转换为list:

map(list,zip(*main_list))

演示:

>>> main_list=[[(1,2),(3,4)],[(5,6),(7,8)]]
>>> zip(*main_list)
[((1, 2), (5, 6)), ((3, 4), (7, 8))]

以你为例:

>>> main_list=[[(np.array([111, 111]), np.array([121, 121])),
...   (np.array([112, 112]), np.array([122, 122])),
...   (np.array([131, 131]), np.array([141, 141])),
...   (np.array([132, 132]), np.array([142, 142]))],
...  [(np.array([211, 211]), np.array([221, 221])),
...   (np.array([212, 212]), np.array([222, 222])),
...   (np.array([231, 231]), np.array([241, 241])),
...   (np.array([232, 232]), np.array([242, 242]))]]
>>> 
>>> zip(*main_list)
[((array([111, 111]), array([121, 121])), (array([211, 211]), array([221, 221]))), 
((array([112, 112]), array([122, 122])), (array([212, 212]), array([222, 222]))), 
((array([131, 131]), array([141, 141])), (array([231, 231]), array([241, 241]))), 
((array([132, 132]), array([142, 142])), (array([232, 232]), array([242, 242])))]

相关问题 更多 >