如何将列表中所有字符串转换为整数?

461

我有一个包含字符串的元组嵌套元组:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

我想将所有字符串元素转换为整数,并将它们放回到一个列表的列表中:
T2 = [[13, 17, 18, 21, 32],
      [7, 11, 13, 14, 28],
      [1, 5, 6, 8, 15, 16]]
15个回答

654

int() 是 Python 标准内置函数,用于将字符串转换为整数值。您可以使用包含数字的字符串作为参数调用它,并返回转换为整数的数字:

>>> int("1") + 1
2
如果您知道列表的结构,即T1(它仅包含列表,只有一级),则可以在Python 3中执行以下操作:
T2 = [list(map(int, x)) for x in T1]

在Python 2中:

T2 = [map(int, x) for x in T1]

4
为什么不使用T2 = map(lambda lol: map(int, lol), T1)呢?无论是map还是列表推导都可以,两者都可以。;) - flying sheep
7
“我觉得双重映射对我来说有点愚蠢,这个看起来很好。” - jamylak
考虑删除 Python 2 的示例(因为 Python 2 已经停止维护)。 - Alisso
@flyingsheep map(lambda) 也很傻 ;) 列表推导式更自然,更易读。 - wjandrea
1
@Alisso我将其下移了。仍在使用遗留的Python 2代码,而且无论如何,除非从回答中删除内容会使其显着恶化,否则不必担心。 - wjandrea

29

你可以使用列表推导式来实现:

T2 = [[int(column) for column in row] for row in T1]

内部列表推导式 ([int(column) for column in row]) 从 row 中的一系列可转换为整数的对象(如十进制字符串)生成一个 int 列表。外部列表推导式 ([... for row in T1])) 生成应用于 T1 中每个项目的内部列表推导式结果的列表。

如果任何行包含无法通过 int 转换的对象,则代码片段将失败。如果要处理包含非十进制字符串的行,则需要更智能的函数。

如果您知道行的结构,可以将内部列表推导式替换为对该行的函数调用。例如:

T2 = [parse_a_row_of_T1(row) for row in T1]

21

仅使用列表推导式:

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

10

不要使用 int( ),而要使用 float( ),这将允许您同时使用小数和整数。


2
你能详细解释一下你的答案吗? - Rico

9

到目前为止,我同意所有人的答案,但问题是如果你没有所有的整数,它们就会崩溃。

如果您想排除非整数,则


如果您想排除非整数,则…
T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())

这只返回实际数字。我不使用直接的列表推导式的原因是,列表推导式会泄露它们的内部变量。


2
isdigit很棘手,试试-1。int(<str>)是通过try / except检查的方法。 - totoro

8
T3=[]

for i in range(0,len(T1)):
    T3.append([])
    for j in range(0,len(T1[i])):
        b=int(T1[i][j])
        T3[i].append(b)

print T3

8
欢迎来到 Stack Overflow!请不要只发布一大段代码,还需要解释这段代码如何解决问题。如果没有解释,那么这并不是一个答案。 - Artemix

8

试一试。

x = "1"

x是一个字符串,因为它有引号包围,但它里面包含了一个数字。

x = int(x)

因为x中有数字1,所以可以将其转换为整数。

要判断一个字符串是否是数字,可以这样做。

def is_number(var):
    try:
        if var == int(var):
            return True
    except Exception:
        return False

x = "1"

y = "test"

x_test = is_number(x)

print(x_test)

它应该在IDLE中打印True,因为x是一个数字。
y_test = is_number(y)

print(y_test)

它应该在IDLE中打印出False,因为y不是一个数字。

2
你的 is_number 函数有误。'1' 不等于 1。这不是 Perl。:-P - Veky
4
不要重复造轮子,使用x.isnumeric() - bfontaine

4

使用列表推导式:

t2 = [map(int, list(l)) for l in t1]

1
在Python 3中,这将返回一个映射对象列表 :( - CpILL

2

这是Python 2的另一个功能性解决方案:

from functools import partial

map(partial(map, int), T1)

不过,Python 3 会有点混乱:

list(map(list, map(partial(map, int), T1)))

我们可以使用一个包装器来解决这个问题。
def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)

2

看这个函数

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

那么

val = parse_int('10')  # Return 10
val = parse_int('0')  # Return 0
val = parse_int('10.5')  # Return 10
val = parse_int('0.0')  # Return 0
val = parse_int('Ten')  # Return None

您可以查看以下内容:
if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'

eval是邪恶的:你应该用ast.literal_eval来替代它。 - Eli Korvigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接