Конвертировать несколько вложенных списков в целые числа - PullRequest
1 голос
/ 30 июня 2019

У меня есть список в списке, и я хочу изменить все значения на целые. Я выполнил это, но предположим, что я указал пользователю, сколько списков в списках он будет иметь. Как я могу преобразовать все эти значения в целые числа?

У меня есть следующий код, который в настоящее время принимает любой список или любой список в списке и преобразует все значения в целые числа. Я вижу, как я могу расширить это до большего количества списков в списках, но это может быть ненужным или, возможно, недостаточным. И, конечно, это кажется очень медленным и требует много кода.

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

Мой список l, а каждый список в l - 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'"

Я понимаю, что это потому, что я конвертирую только списки, вложенные в списки, а не списки, вложенные в списки, вложенные в списки, поэтому мне кажется, что я пытаюсь преобразовать весь список в целое число.

Короче говоря, как я могу построить функцию, которая может преобразовывать любое количество вложенных списков в целые числа?

Ответы [ 2 ]

7 голосов
/ 30 июня 2019

Вы можете использовать рекурсивную функцию, чтобы каждый раз проходить на один уровень внутрь:

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
1 голос
/ 01 июля 2019

Или, может быть, мы могли бы просто использовать re.sub:

import re

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

Выход

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