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]] |
我试着用
1 | print (int("1") + 1) |
上面打印的是
如果您知道列表的结构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] |
内部列表理解(
如果任何一行包含不能由
如果知道行的结构,可以使用对行函数的调用来替换内部列表理解。如。
4我宁愿只使用理解列表:
1 | [[int(y) for y in x] for x in T1] |
不要放
到目前为止,我同意所有人的答案,但问题是如果你没有所有的整数,它们就会崩溃。
如果要排除非整数,则
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) |
如果它只是一个元组,那么像
eval并不是你想做的,以防数据库中出于某种原因出现类似
我想分享一个似乎还没有提到的可用选项:
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) |