在Python中将三位整数拆分为每个数字的三项列表

在Python中将三位整数拆分为每个数字的三项列表,python,Python,我是Python新手。我想做的是取一个三位数的整数,如634,然后将其拆分成一个三项列表,即 数字=[6,3,4] 在此方面的任何帮助都将不胜感激。您可以将数字转换为字符串,然后迭代字符串并将每个字符转换回整数: >>> [int(char) for char in str(634)] [6, 3, 4] 或者,正如@eph在下面正确指出的那样,使用: 转换为字符串,将字符串视为列表并转换回int: In [5]: input = 634 In [6]: digits =[i

我是Python新手。我想做的是取一个三位数的整数,如
634
,然后将其拆分成一个三项列表,即

数字=[6,3,4]


在此方面的任何帮助都将不胜感激。

您可以将数字转换为字符串,然后迭代字符串并将每个字符转换回整数:

>>> [int(char) for char in str(634)]
[6, 3, 4]
或者,正如@eph在下面正确指出的那样,使用:


转换为字符串,将字符串视为列表并转换回int:

In [5]: input = 634
In [6]: digits =[int(i) for i in str(input)]
In [7]: print digits
[6, 3, 4]
像这样:

Python2> i = 634
Python2> digits = [int(d) for d in list(str(i))]
Python2> digits
[6, 3, 4]

这会将整数转换为字符串,将字符拆分为列表,并将列表映射回整数(使用列表理解)。

或者,您可以使用十进制模块执行此操作:

>>> from decimal import Decimal
>>> Decimal(123).as_tuple()
DecimalTuple(sign=0, digits=(1, 2, 3), exponent=0)
>>> Decimal(123).as_tuple().digits
(1, 2, 3)
…这也适用于实数

>>> Decimal(1.1).as_tuple()
DecimalTuple(sign=0, digits=(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5), exponent=-51)
>>> Decimal('1.1').as_tuple()
DecimalTuple(sign=0, digits=(1, 1), exponent=-1)
使用
str()
有点懒惰。比使用数学要慢很多。使用
while
循环会更快

In [1]: n = 634

In [2]: timeit [int(i) for i in str(n)]
100000 loops, best of 3: 5.3 us per loop

In [3]: timeit map(int, str(n))
100000 loops, best of 3: 5.32 us per loop

In [4]: import math

In [5]: timeit [n / 10 ** i % 10 for i in range(int(math.log(n, 10)), -1, -1)]
100000 loops, best of 3: 3.69 us per loop
如果你知道它正好是3位数,你可以做得更快

In [6]: timeit [n / 100, n / 10 % 10, n % 10]
1000000 loops, best of 3: 672 ns per loop

要在不转换为字符串的情况下执行此操作(并且不通过使用日志查看将有多少位数字进行欺骗),请使用对divmod的重复调用:

>>> digits = []
>>> value = 634
>>> while value: value,b = divmod(value,10); digits.insert(0,b)
...
>>> digits
[6, 3, 4]

您可以使用此功能将任何数字转换为十进制数字列表:

def todigits(n):
    return map(int, list(str(n)))
或者这一个正好相反:

def fromdigits(lst):
    return int("".join(map(str, lst)))

你试了什么?请包含您尝试过但无效的代码。我不知道从何开始。正如我所说,我是Python新手。new并不是不阅读教程、不四处尝试的借口。新的也不是不搜索的借口。这些教程真的很好,你会从教程中学到比在这里提问更多的东西。我在教程中翻了一遍,但我并没有立即意识到这一点,因为我有PHP背景。抱歉,如果你认为这是一个“n00b”问题,花时间回答会有失身份。这和我在这个网站上遇到的无数“你怎么用y语言做x”的问题没有什么不同。不完全是这样:多亏了这个社区的优秀成员,我在几分钟内就得到了我需要的答案。字符串是可以使用的。你不需要中间列表。是的,你是对的。但我想我还将演示如何将字符串转换为列表。诚然,另一个答案更适合获得所需的结果。更简单:
map(int,str(634))
@eph,这确实更简单,但在Python 3中
map()
,因此需要额外调用
list()
。答案很好。我只是想知道,你会怎么反过来做呢?假设您拥有示例[6,3,4]中的列表,那么如何从列表中向后创建整数634?谢谢您的帮助。@EazyC,您可以将整数转换为字符串,连接字符串并将结果转换回整数。类似于
int(“.”join(map(str[6,3,4]))
@FrédéricHamidi谢谢你的工作非常好!非常感谢。哦,伙计,太酷了!!我只是想在没有字符串转换的情况下完成它,我已经得到了
[n%pow(10,i+1)/pow(10,i)for i in reversed(xrange(3))]
并且正试图弄清楚如何用数学得到
len(n)
,这时你的答案突然出现了up@Liesmith,不确定您指的是答案的哪一部分。您需要在Python3中使用
/
,而不是
/
进行截断division@gnibbler,在发布之前我已经尝试过了,使用
[n//10**I%10 for I in range(int(math.log(n,10)),-1,-1)]
作为函数“getDigs(n)”。我只是想重现这个问题,但现在它运行得很好。我不知道为什么它以前给了我如此奇怪的结果,所以我删除了我以前的评论,以避免将来会让其他人感到困惑。感谢您提供的非常优雅的解决方案。+1用于不同的方法。不幸的是,在我的测试中,这大约是map(int,str(n))方法的两倍长。问题是询问一个
列表
,这将以相反的顺序输出数字(3,5,1)。
def fromdigits(lst):
    return int("".join(map(str, lst)))
num = 153

while num > 0:
    digit = num % 10
    print(digit)
    num //= 10