在python列表中将两位数整数转换为单个数字?

时间:2016-11-11 22:29:36

标签: python python-2.7 python-3.x

list1 = [6,10,4,8,2,12,10]

我想将list1中大于或等于10的所有整数转换为单个整数。例如,10: 1+0=112: 1+2=3。输出列表应为:

list1 = [6,1,4,8,2,3,1]

任何人都可以帮我逻辑吗?到目前为止我尝试过的逻辑无效:

for itr in list1:
    if ( itr >= 10):
        itr1 = str(itr)
        itr2 = eval(itr[0]+itr[1])

4 个答案:

答案 0 :(得分:8)

如果第一次迭代的总和大于10,则这些示例都不起作用,例如, 999 -> 27。将此方案解释为999 -> 27 -> 9,您可以使用以下函数:

>>> def digit_sum(n):
...     while n > 9:
...         n = sum(int(d) for d in str(n))
...     return n
...
>>> [digit_sum(n) for n in [1, 3, 999, 10, 234, 1234132341]]
[1, 3, 9, 1, 9, 6]

这也假设所有整数都是正数。

答案 1 :(得分:7)

我很惊讶没有人提到这是digital root操作。我们可以使用给定here(感谢,维基百科!)的公式来计算根,而不需要显式循环或递归:

def digital_root(n):
    return 1 + (n - 1) % 9 if n else 0

nums = [6,10,4,8,2,12,10]
roots = [digital_root(num) for num in nums]
print(roots)

答案 2 :(得分:6)

对于较小的数字,您可以通过迭代sum

str(num)个别数字。
[sum(int(c) for c in str(num)) for num in list1]

对于数字总和可以为>9的较大数字,您可以使用divmod来避免转换为str

def reduce_num(n):
    while n > 9:
        n = sum(divmod(n, 10))
    return n

[reduce_num(num) for num in list1]

或者没有迭代(稍微修复@suspicious_dog):

[n-9*int((n-1)/9) for n in list1]    # change to /9.0 for Py2

答案 3 :(得分:2)

repr int,映射回intsum

>>> list1=[6,10,4,8,2,12,10]
[6, 10, 4, 8, 2, 12, 10]
>>> list2=list(map(lambda n: sum(map(int,repr(n))),list1))
[6, 1, 4, 8, 2, 3, 1]

编辑:根据timeit,listcomp方法对于较短的列表更快,但如果你有几百个或更多的项目,则映射更快。

此外,如果您稍后在列表上进行迭代,则可以将其保留为map对象,并避免额外的时间重新投放到list

>>> list2=map(lambda n: sum(map(int,repr(n))),list1)
<map object at 0x0000021AC74C3D30>
>>> for i in list2: print(i)
6
1
4
8
2
3
1