Conversão de listas de cordas (arrays) e listas de números entre si em Python

O negócio

O conteúdo seguinte, juntamente com o código de amostra, explica como converter listas (arrays) de strings (str) e listas de números (int, float) umas para as outras em Python.

  • Converter uma lista de números para uma lista de cordas
    • Converter um número para uma cadeia decimal
    • Converte valores numéricos em fios binários, octal e hexadecimais
    • Converte um valor numérico para uma cadeia em notação exponencial
  • Converter uma lista de cordas para uma lista de números
    • Converter cadeia decimal em numérica
    • Converte cordas binárias, octais e hexadecimais em números
    • Converte cordas em notação exponencial para valores numéricos
    • Converter apenas cordas que possam ser convertidas em números

Ao gerar uma nova lista a partir de uma lista, as compreensões da lista são mais simples de escrever do que para loops. O código de amostra neste artigo também utiliza a compreensão de listas. Para detalhes sobre a compreensão da lista, ver o artigo seguinte.

Note-se que as listas podem armazenar diferentes tipos de dados e são estritamente diferentes das arrays. Use array (biblioteca padrão) ou NumPy nos seguintes casos.

  • Quero tratar de processos que requerem tamanho de memória e endereços de memória.
  • Pretende lidar com matrizes para o processamento numérico de grandes conjuntos de dados, etc.

Converter uma lista de números para uma lista de cordas

Converter um número para uma cadeia decimal

Use str() para converter de numérico para string.

Em Python, os números podem ser expressos numa variedade de formatos, incluindo exponencial, hexadecimal, e binário (notação hexadecimal e binária). str() conversão resulta numa string em notação decimal normal.

Em função do número de dígitos, a notação exponencial pode ser utilizada automaticamente.

l_n = [-0.5, 0, 1.0, 100, 1.2e-2, 0xff, 0b11]

l_n_str = [str(n) for n in l_n]
print(l_n_str)
# ['-0.5', '0', '1.0', '100', '0.012', '255', '3']

Converte valores numéricos em fios binários, octal e hexadecimais

Para converter para cordas binárias, octais, ou hexadecimais (notação binária, notação octal, ou notação hexadecimal), estão disponíveis os seguintes métodos.

  • bin()
  • oct()
  • hex()
  • format()
  • str.format()

Com a função format(), é possível preencher os zeros e ajustar os dígitos.

l_i = [0, 64, 128, 192, 256]

l_i_hex1 = [hex(i) for i in l_i]
print(l_i_hex1)
# ['0x0', '0x40', '0x80', '0xc0', '0x100']

l_i_hex2 = [format(i, '04x') for i in l_i]
print(l_i_hex2)
# ['0000', '0040', '0080', '00c0', '0100']

l_i_hex3 = [format(i, '#06x') for i in l_i]
print(l_i_hex3)
# ['0x0000', '0x0040', '0x0080', '0x00c0', '0x0100']

Converte um valor numérico para uma cadeia em notação exponencial

Como mencionado acima, alguns casos podem estar automaticamente em notação exponencial, dependendo do número de dígitos. No entanto, para converter sempre para uma corda em notação exponencial, use uma das seguintes opções

  • format()
  • str.format()

Para mais informações sobre a função format() e o método str.format(), ver o artigo seguinte.

O número de dígitos da parte mantissa pode ser especificado. Se um E maiúsculo for usado como argumento, a cadeia de saída é também um E maiúsculo.

l_f = [0.0001, 123.456, 123400000]

l_f_e1 = [format(f, 'e') for f in l_f]
print(l_f_e1)
# ['1.000000e-04', '1.234560e+02', '1.234000e+08']

l_f_e2 = [format(f, '.3E') for f in l_f]
print(l_f_e2)
# ['1.000E-04', '1.235E+02', '1.234E+08']

Converter uma lista de cordas para uma lista de números

Converter cadeia decimal em numérica

Usar int() ou float() para converter de string para número.

int() é uma conversão para um número inteiro, e float() é uma conversão para um número de ponto flutuante.

Em float(), as cordas com a parte inteira omitida são complementadas com 0 para a parte inteira.

l_si = ['-10', '0', '100']

l_si_i = [int(s) for s in l_si]
print(l_si_i)
# [-10, 0, 100]

l_sf = ['.123', '1.23', '123']

l_sf_f = [float(s) for s in l_sf]
print(l_sf_f)
# [0.123, 1.23, 123.0]

Converte cordas binárias, octais e hexadecimais em números

O segundo argumento da int() pode ser um radix: 2 para binário, 8 para octal, e 16 para hexadecimal, convertendo uma corda para um número.

Se for especificado 0, cada uma das seguintes cordas prefixadas é convertida num inteiro.

  • 0b
    • dígitos binários
  • 0o
    • octal
  • 0x
    • hexadecimal
l_sb = ['0011', '0101', '1111']

l_sb_i = [int(s, 2) for s in l_sb]
print(l_sb_i)
# [3, 5, 15]

l_sbox = ['100', '0b100', '0o77', '0xff']

l_sbox_i = [int(s, 0) for s in l_sbox]
print(l_sbox_i)
# [100, 4, 63, 255]

Converte cordas em notação exponencial para valores numéricos

Cordas em notação exponencial podem ser convertidas directamente com flutuador() sem a necessidade de especificação especial.

l_se = ['1.23e3', '0.123e-1', '123']

l_se_f = [float(s) for s in l_se]
print(l_se_f)
# [1230.0, 0.0123, 123.0]

Converter apenas cordas que possam ser convertidas em números

A passagem de uma string que não pode ser convertida num número para int() ou float() resultará num ValueError.

Se for definida uma nova função que devolva falsos erros, apenas os elementos que podem ser convertidos podem ser convertidos em números e tornar-se elementos da lista.

def is_int(s):
    try:
        int(s)
    except ValueError:
        return False
    else:
        return True

def is_float(s):
    try:
        float(s)
    except ValueError:
        return False
    else:
        return True

l_multi = ['-100', '100', '1.23', '1.23e2', 'one']

l_multi_i = [int(s) for s in l_multi if is_int(s)]
print(l_multi_i)
# [-100, 100]

l_multi_f = [float(s) for s in l_multi if is_float(s)]
print(l_multi_f)
# [-100.0, 100.0, 1.23, 123.0]
Copied title and URL