455

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

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

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

4

15 回答 15

650

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]
于 2009-03-13T10:58:42.220 回答
28

您可以通过列表理解来做到这一点:

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

内部列表推导 ( )从一系列-able 对象(如十进制字符串[int(column) for column in row])中构建 a listof s 。外部列表推导 ( ) 构建应用到中每个项目的内部列表推导结果的列表。intintrow[... for row in T1])T1

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

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

T2 = [parse_a_row_of_T1(row) for row in T1]
于 2009-03-13T11:02:30.573 回答
17

我宁愿只使用理解列表:

[[int(y) for y in x] for x in T1]
于 2009-05-12T23:33:41.440 回答
11

而不是 put int( ), putfloat( )可以让你使用小数和整数。

于 2014-01-24T22:56:32.900 回答
10

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

如果您想排除非整数,那么

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())

这仅产生实际数字。我不使用直接列表推导的原因是因为列表推导泄露了它们的内部变量。

于 2009-03-13T14:05:10.867 回答
9

试试这个。

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 不是数字。

于 2015-05-30T17:38:14.753 回答
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
于 2011-03-24T22:53:40.640 回答
4

使用列表推导:

t2 = [map(int, list(l)) for l in t1]
于 2009-03-13T11:06:14.590 回答
3

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)
于 2016-08-04T23:22:12.187 回答
3

看到这个功能

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:'
于 2017-07-13T06:22:58.080 回答
2

在 Python 3.5.1 中,类似这样的工作:

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

Enter number:  4.7
4
5

乔治。

于 2016-05-27T17:17:22.480 回答
2

Python 内置了函数 int(string) 和可选参数库。

如果您的字符串包含一个整数值,它会将其转换为相应的整数值。但是,如果您将十进制数字作为字符串,则需要 float() 来转换它。

用法:

a = '22'
b = int(a)

if a = '22.22'
b = int(a) '''will give error, invalid literal for int().'''
b = float(a) '''will convert the string.'''
于 2020-06-22T11:31:39.990 回答
1

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

Eval不是您想要做的,以防由于__import__("os").unlink("importantsystemfile")某种原因在您的数据库中有类似的东西。始终验证您的输入(如果没有其他内容,如果输入错误,将引发异常 int())。

于 2009-03-13T11:04:40.863 回答
-2

你可以这样做:

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)  
于 2018-05-01T13:23:44.813 回答
-2

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

rumpy.random.permutation(x)

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

于 2019-01-24T15:39:20.490 回答