【问题标题】:Convert Multiple Nested Lists to Integers将多个嵌套列表转换为整数
【发布时间】:2019-11-11 12:53:49
【问题描述】:

我在列表中有一个列表,并且想将所有值更改为整数。我已经完成了这项工作,但假设我让用户指定了他们将拥有的列表中的列表数量。如何将所有这些值也转换为整数?

我有以下代码,它当前采用任何列表或列表中的任何列表,并将所有值转换为整数。我可以看到如何将其扩展到列表中的更多列表,但这可能是不必要的,或者可能还不够。当然,这看起来很慢并且需要大量代码。

for i in l:
    index = l.index(i)
    l[index] = list(map(int, l[index]))

我的列表是ll 中的每个列表都是i。我获取 i 的索引,并将其中的所有值转换为整数。如何创建一个函数/循环来接收列表中有多少个列表,并将它们全部转换为整数?

例如在这个输入上:

l = [['6', '5'], '7', ['88', '99', '1']]

上面的代码会返回:

[[6, 5], 7, [88, 99, 1]]

但是,如果我有:

l = [['6', '7'], ['6', ['7', '8']]]

我收到错误:

"TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'"

我知道这是因为我只转换嵌套在列表中的列表,而不是嵌套在嵌套在列表中的列表中的列表,所以它认为我正在尝试将整个列表转换为整数。

长话短说,我如何构建一个可以将任意数量的嵌套列表转换为整数的函数?

【问题讨论】:

    标签: python python-3.x list type-conversion int


    【解决方案1】:

    您可以使用递归函数每次进入一层:

    def convert_rec(x):
        if isinstance(x, list):
            return list(map(convert_rec, x))
        else:
            return int(x)
    

    请注意,现在您不需要使用循环,只需在整个列表中调用此函数即可。这按预期工作:

    >>> l = [['6', '5'], '7', ['88', '99', '1']]
    >>> print(convert_rec(l))
    [[6, 5], 7, [88, 99, 1]]
    
    >>> l = [['6', '7'], ['6', ['7', '8']]]
    >>> print(convert_rec(l))
    [[6, 7], [6, [7, 8]]]
    

    另请注意,此代码在尝试转换为 int 时可能会引发异常,因此,要获得更通用且更易于调试的代码,请添加 try/except

    def convert_rec(x):
        if isinstance(x, list):
            return list(map(convert_rec, x))
        else:
            try:
                x = int(x)
            except ValueError as ve:
                print(ve)
            except TypeError as te:
                print(te)
            finally:
                return x
    

    【讨论】:

    • 感谢您的时间和工作!你能解释一下'isinstance'代表什么吗?我对 python 很陌生。
    • @watwolves8855 看看here。简而言之,它检查第一个参数(对象)是否是第二个参数的实例或子类。等效(或多或少)将是:type(x) is list。阅读this interesting answer以获得更多参考
    【解决方案2】:

    或者我们可以简单地使用re.sub

    import re
    
    print(eval(re.sub(r"'", "", str([['6', '5'], '7', ['88', '99', '1']]))))
    

    输出

    [[6, 5], 7, [88, 99, 1]]
    

    【讨论】:

    • 我认为 OP 想要一个实际的嵌套整数列表。您的代码会生成一个字符串。
    • 感谢您的回答。我不确定're.sub'是做什么的。据我所知,它在第三个参数的列表中接受了一个参数 '"(')"',并没有用 '""' 代替它。那是对的吗?另外,'re.sub('之后的 r 的目的是什么?谢谢。
    • 假设输入列表是l,你可以用str(l)开始你的代码,然后在sub的结果上做eval()得到一个列表作为输入并返回最后列出一个列表
    猜你喜欢
    • 2022-01-09
    • 2016-09-28
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多