将数字列表转为一个整数
我想要输入一个整数,去掉这个整数里面所有的奇数数字,然后返回这个新的整数。不能使用内置函数。我到目前为止的做法是把它变成了一个列表,但我需要它输出一个整数。
def rem_odd(integer):
x = []
while integer > 0:
if integer % 2 == 0:
x = [(integer % 10)] + x
integer = integer / 10
else:
integer = integer / 10
return x
5 个回答
0
整数可以拆分成每个数字乘以10的不同次方。
比如说:
- 24 = 2 * 10 + 4
- 256 = 2 * 100 + 5 * 10 + 6
你可以通过列表中数字的位置来确定当前的10的次方:
def getInt(lst):
res = 0
pow = len(lst) - 1
for el in lst:
res += el * (10 ** pow)
pow -= 1
return res
现在调用 >>> getInt([2,4,8])
会返回:248
如果不使用内置的len函数,想要获取列表的长度其实也很简单,因为你可以用递归的方法来实现。
0
如果你不能使用像 int() 或 join() 这样的内置函数,你可以这样做:
def rem_odd(integer):
x = []
while integer > 0:
if integer % 2 == 0:
x = [(integer % 10)] + x
integer = integer / 10
else:
integer = integer / 10
res = 0
digits = len(x)
for i in range(digits):
res += x[i] * (10**(digits-i-1))
return res
1
由于这里其他的回答都没有严格遵循“不能使用内置函数”的要求,我提供了一个扩展的Python代码,供提问者使用:
/* rem_odd.c */
#include <Python.h>
#include <math.h>
static PyObject *
rem_odd(PyObject *self, PyObject *args)
{
int digit, ix, n, num, result;
int digits[20]; /* handles up to 2^64 (20 digits) */
if (!PyArg_ParseTuple(args, "i", &num))
return NULL;
n = num;
ix = 0;
while (n > 0) {
digit = n % 10;
n /= 10;
if (digit % 2 == 0)
digits[ix++] = digit;
}
result = 0;
while (ix-- >= 0) {
result += (int)(pow(10., ix)) * digits[ix];
}
return Py_BuildValue("i", result);
}
static PyMethodDef RemOddMethods[] = {
{"rem_odd", rem_odd, METH_VARARGS,
"Remove odd digits from an integer and return another integer."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initrem_odd(void)
{
(void) Py_InitModule("rem_odd", RemOddMethods);
}
接下来使用 distutils
:
from distutils.core import setup, Extension
rem_odd_module = Extension('rem_odd',
sources = ['rem_odd.c'])
setup(name='rem_odd', version='1.0',
description='Remove odd digits from integers -- NO BUILTINS',
ext_modules = [rem_odd_module])
示例用法(在运行 setup.py build
和 setup.py install
之后):
Python 2.7.6 (default, Feb 26 2014, 12:01:28)
[GCC 4.8.2 20140206 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rem_odd import rem_odd
>>> rem_odd(203)
20
>>> rem_odd(9684684)
684684
>>> rem_odd(123456789)
2468
1
根据对“内置函数”的宽松理解:
def rem_odd(integer):
return int(''.join(x for x in str(integer) if not x in '13579'))
如果我们对内置函数的定义更严格一些:
def rem_odd(integer):
r = 0
mult = 1
while integer > 0:
if integer % 2 == 0:
r = r + mult * (integer % 10)
integer = integer // 10
mult *= 10
return r
~
5
假设你用 203
作为参数来调用你的函数:
x = rem_odd(203)
你得到的结果是 x
= [2, 0]
接下来你要做的是:
>>> x = [2, 0]
>>> x = [str(a) for a in x]
>>> x
['2', '0']
>>> int(''.join(x))
20
>>>
上面的做法是通过字符串操作来解决问题。如果不使用内置函数,数学上的解决方案是:
>>> x = rem_odd(203)
>>> p = y = 0
>>> for i in x[::-1]:
... y += i * (10 ** p)
... p += 1
...
>>> y
20
你从列表的右边开始遍历,也就是从个位数开始,一直到最高的十的幂,然后把每个数字乘以 10 的指数次方。