list1 = [6,10,4,8,2,12,10]
我想将list1
中大于或等于10的所有整数转换为单个整数。例如,10: 1+0=1
,12: 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])
答案 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,映射回int
和sum
?
>>> 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