我有一个来自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
来实现它,但还没有得到任何不错的结果。
答案 0 :(得分:589)
int()
是用于将字符串转换为整数值的Python标准内置函数。您可以使用包含数字作为参数的字符串来调用它,并返回转换为整数的数字:
print (int("1") + 1)
以上打印2
。
如果您知道列表的结构,T1(它只包含列表,只有一个级别),您可以在Python 2中执行此操作:
T2 = [map(int, x) for x in T1]
在Python 3中:
T2 = [list(map(int, x)) for x in T1]
答案 1 :(得分:28)
您可以使用列表解析来执行此操作:
T2 = [[int(column) for column in row] for row in T1]
内部列表理解([int(column) for column in row]
)在list
中从一系列int
能够对象(如十进制字符串)构建int
row
个[... for row in T1])
}。外部列表理解(T1
)构建了应用于int
中每个项目的内部列表理解结果的列表。
如果任何行包含无法由T2 = [parse_a_row_of_T1(row) for row in T1]
转换的对象,则代码段将失败。如果要处理包含非十进制字符串的行,则需要更智能的函数。
如果您知道行的结构,则可以通过调用行的函数来替换内部列表推导。例如
{{1}}
答案 2 :(得分:16)
我宁愿只使用理解列表:
[[int(y) for y in x] for x in T1]
答案 3 :(得分:13)
不要放int( )
,而是放float( )
,这样就可以使用小数和整数。
答案 4 :(得分:11)
到目前为止,我同意每个人的答案,但问题是,如果你没有所有整数,他们会崩溃。
如果你想排除非整数,那么
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())
这只产生实际数字。我不使用直接列表推导的原因是因为列表推导泄漏了它们的内部变量。
答案 5 :(得分: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
答案 6 :(得分:6)
试试这个。
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不是数字。
答案 7 :(得分:4)
使用列表推导:
t2 = [map(int, list(l)) for l in t1]
答案 8 :(得分:4)
在Python 3.5.1中,这些工作起作用:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
和
Enter number: 4.7
4
5
乔治。
答案 9 :(得分: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)
答案 10 :(得分: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:'
答案 11 :(得分:1)
如果它只是一个元组元组,像rows=[map(int, row) for row in rows]
这样的东西就可以了。 (有一个列表理解和对map(f,lst)的调用,在那里等于[f(a)for a lst]。)
Eval 不您想要做什么,以防由于某种原因数据库中出现类似__import__("os").unlink("importantsystemfile")
的内容。
始终验证您的输入(如果没有其他内容,如果输入错误,则会引发异常int())。
答案 12 :(得分:1)
Python内置了int(string)函数和可选的参数库。
如果您的字符串包含一个Integer值,它将把它转换为相应的Integer值。 但是,如果将十进制数字作为字符串,则需要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.'''
答案 13 :(得分:0)
我想分享一个似乎此处未提及的可用选项:
rumpy.random.permutation(x)
将生成数组x的随机排列。并非完全是您想要的内容,但这是解决类似问题的潜在方法。
答案 14 :(得分:-1)
您可以这样做:
$ g++ -Wall -pedantic -o test test.cc
a.cc: In function ‘int main()’:
a.cc:13:7: warning: statement has no effect [-Wunused-value]
a == 1;
^