【Python CheckiO 题解】Flatten a List


CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。

CheckiO 官网:https://checkio.org/

我的 CheckiO 主页:https://py.checkio.org/user/TRHX/

CheckiO 题解系列专栏:https://itrhx.blog.csdn.net/category_9536424.html

CheckiO 所有题解源代码:https://github.com/TRHX/Python-CheckiO-Exercise


题目描述

【Flatten a List】:有一个包含整数的列表,其中可能包含更多的列表和整数,也就是嵌套列表,您需要将嵌套列表进行降维处理,将所有整数值放在一个一维列表中,列表中的元素顺序应与原始列表中的顺序相同,另外还需要保持程序的小巧和精简,因此,您的代码应少于140个字符(包括空格)。

【链接】https://py.checkio.org/mission/flatten-list/

【输入】:带整数的嵌套列表

【输出】:带整数的一维列表

【前提】:0 ≤ |array| ≤ 100;∀ x ∈ array : -232 < x < 232 or x is a list;depth < 10

【范例】

flat_list([1, 2, 3]) == [1, 2, 3]
flat_list([1, [2, 2, 2], 4]) == [1, 2, 2, 2, 4]
flat_list([[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]) == [2, 4, 5, 6, 6, 6, 6, 6, 7]
flat_list([-1, [1, [-2], 1], -1]) == [-1, 1, -2, 1, -1]

解题思路

简单粗暴,可以直接将这个嵌套列表转换成字符串,然后提取字符串中所有的数字,去掉中括号,再将所有的数字转换成一个列表,注意转换成列表时,要将每个数字由 str 类型转换成 int 类型,不然生成的列表将是 ['1', '2', '3', '4'] 的形式,而不是 [1, 2, 3, 4] 的形式

代码实现

import re


def flat_list(array):
    array = re.findall(r'-?\d+', str(array))
    list = []
    for i in array:
        i = int(i)
        list.append(i)
    return list

'''
解法二:此方法有缺陷,如果给定的列表为空就会报错,只适合非空列表

def flat_list(array):
    array = str(array)
    array = array.replace('[','').replace(']','')
    return list(eval(array))
'''

if __name__ == '__main__':
    assert flat_list([1, 2, 3]) == [1, 2, 3], "First"
    assert flat_list([1, [2, 2, 2], 4]) == [1, 2, 2, 2, 4], "Second"
    assert flat_list([[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]) == [2, 4, 5, 6, 6, 6, 6, 6, 7], "Third"
    assert flat_list([-1, [1, [-2], 1], -1]) == [-1, 1, -2, 1, -1], "Four"
    print('Done! Check it')

大神解答

大神解答 NO.1
flat_list=f=lambda d:[d]if int==type(d)else sum(map(f,d),[])
大神解答 NO.2
def flat_list(l):
    r = []
    def f(l):
        for i in l:
            r.append(i) if type(i) is int else f(i)
    f(l)
    return r
大神解答 NO.3
def flat_list(array):
    #Memento 140!
    return eval('[' + str(array).replace('[', '').replace(']', '') + ']')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT.BOB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值