如何在Python中将字符串转换为整数?

How to convert strings into integers in Python?

我有一个来自MySQL查询的元组,如下所示:

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

我想把所有的字符串元素转换成整数,并把它们放回到一个列表中:

1
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

我试着用eval来实现它,但还没有得到任何好的结果。


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

1
print (int("1") + 1)

上面打印的是2

如果您知道列表的结构T1(它只包含列表,只有一个级别),那么可以在python 2中这样做:

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

在Python 3中:

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


您可以通过列表理解来完成此操作:

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

内部列表理解([int(column) for column in row]row中的int类对象序列(如十进制字符串)构建intlist。外部列表理解([... for row in T1])构建了应用于T1中每个项目的内部列表理解结果列表。

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

如果知道行的结构,可以使用对行函数的调用来替换内部列表理解。如。

4


我宁愿只使用理解列表:

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

不要放int( ),而是放float( ),它允许您使用小数和整数。


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

如果要排除非整数,则

1
2
3
4
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())

这只产生实际数字。我不使用直接列表理解的原因是列表理解泄漏了它们的内部变量。


1
2
3
4
5
6
7
8
9
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


试试这个。

1
x ="1"

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

1
x = int(x)

因为x中有数字1,所以我可以把它转换成整数。

要查看字符串是否是数字,可以这样做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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是一个数字。

1
2
3
y_test = is_number(y)

print(y_test)

它应该打印为idle false,因为y不是数字。


在python 3.5.1中,类似这样的东西可以工作:

1
2
3
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

1
2
3
Enter number:  4.7
4
5

乔治。


使用列表理解:

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


查看此功能

1
2
3
4
5
6
7
def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

然后

1
2
3
4
5
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

你也可以查一下

1
2
if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'


另一个针对python 2的功能解决方案是:

1
2
3
from functools import partial

map(partial(map, int), T1)

但python 3会有点混乱:

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

我们可以用包装纸来解决这个问题

1
2
3
4
def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)


如果它只是一个元组,那么像rows=[map(int, row) for row in rows]这样的东西就可以了。(这里有一个列表理解和一个对map(f,lst)的调用,它等于[f(a)for a in lst]。)

eval并不是你想做的,以防数据库中出于某种原因出现类似__import__("os").unlink("importantsystemfile")的情况。始终验证您的输入(如果没有其他内容,则如果输入错误,则会引发异常int())。


我想分享一个似乎还没有提到的可用选项:

1
rumpy.random.permutation(x)

将生成数组x的随机排列。不完全是您要求的,但它是类似问题的潜在解决方案。


你可以这样做:

1
2
3
4
5
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 if a.isdigit()) for b in T1)  
print(new_list)