2016-11-11 23 views
9
list1 = [6,10,4,8,2,12,10] 

Tôi muốn chuyển đổi tất cả các số nguyên trong list1 lớn hơn hoặc bằng 10 thành một số nguyên duy nhất. Ví dụ: 10: 1+0=1, 12: 1+2=3. Danh sách đầu ra phải là:chuyển đổi hai chữ số nguyên thành một chữ số bên trong danh sách python?

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

Mọi người có thể giúp tôi với logic không? Logic tôi đã cố gắng cho đến nay mà không hoạt động:

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

Làm thế nào về '99'? Có nên là '9 + 9 => 1 + 8 = 9' không? – Psidom

+0

Hãy thử 'in (itr [0] + itr [1])' và xem những gì bạn nhận được. –

Trả lời

6

Đối với số lượng nhỏ, bạn có thể sum lên các chữ số cá nhân bằng cách duyệt qua str(num)

[sum(int(c) for c in str(num)) for num in list1] 

Đối với số lượng lớn mà tổng của các chữ số có thể được >9, bạn có thể sử dụng divmod để tránh chuyển sang str:

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

[reduce_num(num) for num in list1] 

Hoặc không lặp đi lặp lại (nhẹ sửa chữa để @suspicious_dog):

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

Mặc dù OP không rõ ràng, điều này sẽ cho> 1 chữ số cho các trường hợp như '28' ->' 10' – brianpck

+0

Điểm tốt. Thêm một cách tiếp cận thay thế để giảm số lượng. – AChampion

2

repr int, lập bản đồ trở lại int s, và 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] 

Chỉnh sửa: theo danh sách ngắn hơn, nhưng nếu bạn có vài trăm mục trở lên, ánh xạ nhanh hơn.

Ngoài ra, nếu bạn đang iterating trên danh sách sau, bạn có thể giữ nó như là một đối tượng map và tránh thêm thời gian cho đúc trở lại một 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 
8

Không ai trong số những ví dụ sẽ làm việc nếu tổng của lần lặp đầu tiên lớn hơn 10, ví dụ 999 -> 27. Giải thích kịch bản này như 999 -> 27 -> 9, bạn có thể sử dụng chức năng sau:

>>> 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] 

này cũng giả định rằng tất cả các số nguyên dương.

7

Tôi ngạc nhiên không ai chưa đề cập rằng đây là hoạt động digital root. Chúng tôi có thể sử dụng công thức được cung cấp here (Cảm ơn, Wikipedia!) Để tính toán gốc mà không có vòng lặp hoặc đệ quy rõ ràng:

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) 
+0

Không xử lý '0' chính xác nhưng tương đối dễ sửa '1 + (n - 1)% 9 nếu n else 0'. Hoặc: 'n-9 * int ((n-1) /9.0)' – AChampion

+0

@AChampion Cảm ơn! Bạn đúng. Dường như công thức cho phép [cắt ngắn/modulo] (https://en.wikipedia.org/wiki/Modulo_operation) (như trong Java), trong khi Python sử dụng phân chia/modulo tầng. Tôi đã áp dụng bản sửa lỗi của bạn. –

Các vấn đề liên quan