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)
如果第一次迭代的总和大于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)
这也假设所有整数都是正数.
我很惊讶没有人提到这是数字根操作.我们可以使用这里给出的公式(谢谢,维基百科!)来计算没有显式循环或递归的根:
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)
对于较小的数字,您可以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)