Eu tenho uma tupla de tuplas de uma consulta MySQL como esta:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Gostaria de converter todos os elementos da string em números inteiros e colocá-los novamente em uma lista de listas:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Tentei alcançá-lo, eval
mas ainda não obtive nenhum resultado decente.
Respostas:
int()
é a função interna padrão do Python para converter uma string em um valor inteiro. Você o chama com uma sequência que contém um número como argumento e retorna o número convertido em um número inteiro:As impressões acima
2
.Se você conhece a estrutura da sua lista, T1 (que simplesmente contém listas, apenas um nível), você pode fazer isso no Python 2:
No Python 3:
fonte
T2 = map(lambda lol: map(int, lol), T1)
? Compreensões de mapas ou listas, ambas são bobagens;)Você pode fazer isso com uma compreensão da lista:
A lista interna compreensão (
[int(column) for column in row]
) constrói alist
deint
s a partir de uma sequência deint
objetos -able, como seqüências de caracteres decimais, emrow
. A compreensão da lista externa ([... for row in T1])
) cria uma lista dos resultados da compreensão da lista interna aplicada a cada item noT1
.O trecho de código falhará se alguma das linhas contiver objetos que não podem ser convertidos
int
. Você precisará de uma função mais inteligente se desejar processar linhas que contenham cadeias não decimais.Se você conhece a estrutura das linhas, pode substituir a compreensão da lista interna por uma chamada para uma função da linha. Por exemplo.
fonte
Prefiro usar apenas listas de compreensão:
fonte
Em vez de colocar
int( )
, coloque ofloat( )
que permitirá que você use decimais junto com números inteiros.fonte
Eu concordo com as respostas de todos até agora, mas o problema é que, se você não tiver todos os números inteiros, eles travarão.
Se você deseja excluir não-inteiros,
Isso gera apenas dígitos reais. A razão de eu não usar a compreensão direta da lista é porque a compreensão da lista vaza suas variáveis internas.
fonte
isdigit
é complicado, experimente-1
.int(<str>)
é a maneira de verificar portry
/except
.fonte
Tente isso.
x é uma string porque possui aspas, mas possui um número.
Como x tem o número 1, posso transformá-lo em um número inteiro.
Para ver se uma sequência é um número, você pode fazer isso.
Ele deve ser impresso em IDLE True porque x é um número.
Ele deve ser impresso em IDLE False porque y não é um número.
fonte
x.isnumeric()
.Usando compreensão de lista:
fonte
No Python 3.5.1, coisas como estas funcionam:
e
George.
fonte
Veja esta função
Então
Você também pode verificar
fonte
eval
é mau: você deve substituí-lo porast.literal_eval
.Outra solução funcional para o Python 2:
O Python 3 ficará um pouco confuso:
podemos consertar isso com um invólucro
fonte
Se for apenas uma tupla, algo como
rows=[map(int, row) for row in rows]
fará o truque. (Existe uma compreensão da lista e uma chamada para mapear (f, lst), que é igual a [f (a) para a in lst], lá.)Eval não é o que você deseja fazer, caso haja algo como
__import__("os").unlink("importantsystemfile")
no seu banco de dados por algum motivo. Sempre valide sua entrada (se não houver mais nada, a exceção int () aumentará se você tiver uma entrada incorreta).fonte
Você pode fazer algo assim:
fonte
Quero compartilhar uma opção disponível que ainda não parece ser mencionada aqui:
Irá gerar uma permutação aleatória da matriz x. Não é exatamente o que você pediu, mas é uma solução potencial para perguntas semelhantes.
fonte