Python: One-Liner для выполнения операции над элементами в массиве 2d (список списков)?

У меня есть список списков, каждый из которых содержит различное количество строк. Я хотел бы (эффективно) преобразовать все это в целые, но я чувствую себя немного плотно, так как я не могу заставить его работать на всю жизнь. Я пытался: newVals = [int (x) для x в [row для строк в значениях]]

Где 'values' - это список списков. Он постоянно говорит, что x является списком и поэтому не может быть аргументом, если int(). Очевидно, я делаю что-то глупое здесь, что это? Есть ли принятая идиома для такого рода вещей?

Ответ 1

Это оставляет ints вложенным

[map(int, x) for x in values]

Если вы хотите, чтобы они были сплющены, это не сложно либо

для Python3 map() возвращает итератор. Вы можете использовать

[list(map(int, x)) for x in values]

но вы можете предпочесть использовать вложенный LC в этом случае

[[int(y) for y in x] for x in values]

Ответ 2

Как насчет:

>>> a = [['1','2','3'],['4','5','6'],['7','8','9']]
>>> [[int(j) for j in i] for i in a]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Ответ 3

Вы просто используете неправильный порядок и скобки - должны быть:

inputVals = [['1','2','3'], ['3','3','2','2']]
[int(x) for row in inputVals for x in row]

Или если вам нужен список списка на выходе, то:

map(lambda row: map(int, row), inputVals)

Ответ 4

Уродливым способом является использование evalf:

>>> eval(str(a).replace("'",""))
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Если вы не возражаете против всех своих номеров в одном массиве, вы можете пойти:

>>> a = [['1','2','3'],['4','5','6'],['7','8','9']]
>>> map(int,sum(a,[]))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Ответ 5

Еще один обходной путь

a = [[1, 2, 3], [7, 8, 6]]
list(map(lambda i: list(map(lambda j: j - 1, i)), a))
[[0, 1, 2], [6, 7, 5]] #output