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

ken*_*nny 9 python python-2.7 python-3.x

list1 = [6,10,4,8,2,12,10]
Run Code Online (Sandbox Code Playgroud)

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

list1 = [6,1,4,8,2,3,1]
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我逻辑吗?到目前为止我尝试过的逻辑不起作用:

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

bri*_*pck 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]
Run Code Online (Sandbox Code Playgroud)

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


laz*_*dog 7

我很惊讶没有人提到这是数字根操作.我们可以使用这里给出的公式(谢谢,维基百科!)来计算没有显式循环或递归的根:

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)
Run Code Online (Sandbox Code Playgroud)


ACh*_*ion 6

对于较小的数字,您可以sum通过迭代遍历各个数字str(num)

[sum(int(c) for c in str(num)) for num in list1]
Run Code Online (Sandbox Code Playgroud)

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

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

[reduce_num(num) for num in list1]
Run Code Online (Sandbox Code Playgroud)

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

[n-9*int((n-1)/9) for n in list1]    # change to /9.0 for Py2
Run Code Online (Sandbox Code Playgroud)