Eu tenho um tuple de tuplos de uma consulta MySQL como esta:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
I'gostaria de converter todos os elementos de string em inteiros e colocá-los de volta em uma lista de listas:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Eu tentei conseguir com 'eval' mas ainda não consegui'não consegui nenhum resultado decente.
int()
é a função padrão Python embutida para converter uma string em um valor inteiro. Você a chama com uma string contendo um número como argumento, e ela retorna o número convertido para um número inteiro:
print (int("1") + 1)
As impressões acima são 2
.
Se você conhece a estrutura da sua lista, T1 (que simplesmente contém listas, apenas um nível), você poderia fazer isso em Python 2:
T2 = [map(int, x) for x in T1]
Em Python 3:
T2 = [list(map(int, x)) for x in T1]
Você pode fazer isso com a compreensão de uma lista:
T2 = [[int(column) for column in row] for row in T1]
A compreensão da lista interna ([int(column) for column in row]
) constrói uma list
de int
s a partir de uma seqüência de objetos int
-able, como cordas decimais, em row
. A compreensão da lista externa ([... para linha em T1])
) constrói uma lista dos resultados da compreensão da lista interna aplicada a cada item em T1
.
O trecho de código falhará se alguma das linhas contiver objetos que podem't ser convertidos por int
. Você'vai precisar de uma função mais inteligente se você quiser processar linhas contendo strings não-decimais.
Se você conhece a estrutura das linhas, você pode substituir a compreensão da lista interna por uma chamada para uma função da linha. Por exemplo.
T2 = [parse_a_row_of_T1(row) for row in T1]
Se ele'é apenas um tuple de tuplos, algo como rows=[map(int, row) for row in rows]
irá fazer o truque. (Ali's uma compreensão de lista e uma chamada para map(f, lst), que é igual a [f(a) para a in lst], ali dentro).
Eval is not what you want to do, in case there's something like __import__("os").unlink("importantsystemfile")
in your database for some reason.
Sempre valide sua entrada (se não tiver mais nada, a exceção int() irá aumentar se você tiver uma entrada ruim).