将水平列表翻转为垂直列表,将垂直列表翻转为水平列表

时间:2021-04-28 08:19:35

标签: python

我想创建一个函数,将水平列表翻转为垂直列表,将垂直列表翻转为水平列表。比如将一个 1×n 的列表(1 行和 n 列)翻转成一个 n×1 的列表(n 行和 1 列),反之亦然。

例如:

flip_list([1, 2, 3, 4]) ➞ [[1], [2], [3], [4]]
flip_list([[5], [6], [9]]) ➞ [5, 6, 9]

第一个是水平到垂直的,第二个是垂直到水平的。

我尝试了几种方法,但无法让它们发挥作用。

3 个答案:

答案 0 :(得分:1)

怎么样:

def flip_list(lst):
    if not lst:
        return lst

    is_vertical = isinstance(lst[0], list)
    
    if is_vertical:
        return [el[0] for el in lst]
    
    return [[el] for el in lst]

首先我们检查给定的 lst 是否“真实”,参见 docs。如果列表为空或无等,这将简单地返回 lst

您的示例表明,在垂直列表中,每个元素本身都是另一个包含值的列表,代表列。 这意味着我们可以在查看第一个元素时确定列表是垂直的还是水平的。

此时我们假设列表不为空,因为我们事先检查过。所以我们简单地获取第一个元素 lst[0] 并使用内置的 isinstance 来检查它是否是内置列表类的实例。

为了翻转列表,我们使用 list comprehension。为了将垂直转换为水平,我们迭代列表的每个元素并将每个元素的第一个元素写入新列表。消除列。

> lst = [[5], [6], [9]]
> [el[0] for el in lst]
[5, 6, 9]

反之亦然,我们将每个元素插入一个新列表,创建列:

> lst = [1, 2, 3, 4]
> [[el] for el in lst]
[[1], [2], [3], [4]]

答案 1 :(得分:0)

我会有这样的事情:

def flip_list(list_flip):
    if isinstance(list_flip[0],list): return [x[0] for x in list_flip]
    else: return [[x] for x in list_flip]

答案 2 :(得分:0)

也许你可以尝试这样的事情:

def flip_list(arr):
    return [j for i in arr for j in i] \
        if (isinstance(arr[0], list)) \
        else list(map(lambda x: [x], arr))


print(flip_list([[1, 2, 3], [2, 2], [3]]))
print(flip_list([1, 2, 3]))
print(flip_list([[1], [2], [3]]))

'''
Output: 
[1, 2, 3, 2, 2, 3]
[[1], [2], [3]]
[1, 2, 3]
'''
相关问题