在Python中把字符串列表(数组)和数字列表相互转换

商业

下面的内容,连同示例代码,解释了如何在Python中把字符串(str)的列表(数组)和数字(int, float)的列表相互转换。

  • 将一个数字列表转换为一个字符串列表
    • 将一个数字转换为十进制字符串
    • 将数字值转换为二进制、八进制和十六进制的字符串
    • 将一个数字值转换为指数符号的字符串
  • 将一个字符串列表转换为一个数字列表
    • 将十进制字符串转换为数字
    • 将二进制、八进制和十六进制字符串转换为数字
    • 将指数符号的字符串转换为数字值
    • 只转换可以转换为数字的字符串

当从一个列表中生成一个新的列表时,列表理解比for循环更容易编写。本文中的示例代码也使用了列表理解法。关于列表理解的细节,请看下面的文章。

注意,列表可以存储不同类型的数据,与数组有严格的区别。在以下情况下使用数组(标准库)或NumPy。

  • 我想处理需要内存大小和内存地址的进程。
  • 想处理数组,用于大数据集的数值处理,等等。

将一个数字列表转换为一个字符串列表

将一个数字转换为十进制字符串

使用str()将数字转换为字符串。

在Python中,数字可以用多种格式表示,包括指数、十六进制和二进制(十六进制和二进制符号)。str()转换的结果是一个正常十进制符号的字符串。

根据数字的多少,可能会自动使用指数符号。

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']

将数字值转换为二进制、八进制和十六进制的字符串

要转换为二进制、八进制或十六进制(二进制符号、八进制符号或十六进制符号)的字符串,可采用以下方法。

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

通过format()函数,可以填入零和调整数字。

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']

将一个数字值转换为指数符号的字符串

如上所述,根据数字的数量,有些情况可能自动采用指数符号。然而,要想总是转换为指数符号的字符串,请使用以下方法之一

  • format()
  • str.format()

关于format()函数和字符串方法str.format()的更多信息,请参见以下文章。

可以指定尾数部分的位数。如果用大写的E作为参数,输出的字符串也是大写的E。

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']

将一个字符串列表转换为一个数字列表

将十进制字符串转换为数字

使用int()或float()从字符串转换为数字。

int()是转换为整数,float()是转换为浮点数。

在float()中,省略了整数部分的字符串的整数部分用0来补充。

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]

将二进制、八进制和十六进制字符串转换为数字

int()的第二个参数可以是一个弧度。2代表二进制,8代表八进制,16代表十六进制,将一个字符串转换为一个数字。

如果指定为0,以下每个前缀的字符串将被转换为整数。

  • 0b
    • 二进制数字
  • 0o
    • 八进制
  • 0x
    • 十六进制
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]

将指数符号的字符串转换为数字值

指数符号的字符串可以直接用float()转换,不需要特别说明。

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]

只转换可以转换为数字的字符串

向int()或float()传递一个不能转换为数字的字符串,将导致ValueError。

如果定义了一个新的函数,错误时返回false,那么只有可以转换的元素可以转换为数字,成为列表的元素。

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]