Tính tổng các số nguyên to trong list Python
12/6/2010 2:01:23 AM
Lý Như Hà · Lý Như Hà 02:01 06/12/2010 Tôi có một danh sách các số như [1,2,3,4,5...], và tôi muốn tính toán (1+2)/2và cho số thứ hai, (2+3)/2thứ ba, (3+4)/2v.v. Làm thế nào tôi có thể làm điều đó? Tôi muốn tính tổng số đầu tiên với số thứ hai và chia nó cho 2, sau đó tính tổng số thứ hai với số thứ ba và chia cho 2, v.v. Ngoài ra, làm cách nào tôi có thể tính tổng một danh sách các số? a = [1, 2, 3, 4, 5, ...]Là nó: b = sum(a) print bđể có được một số? Điều này không hiệu quả với tôi. 398 hữu ích 3 bình luận 1.8m xem chia sẻ answer Vũ Thảo Ly · Vũ Thảo Ly 02:07 06/12/2010 Câu hỏi 1: Vậy bạn muốn (phần tử 0 + phần tử 1) / 2, (phần tử 1 + phần tử 2) / 2, ... v.v. Chúng tôi tạo hai danh sách: một trong số mọi phần tử ngoại trừ phần tử đầu tiên và một trong mọi phần tử ngoại trừ phần tử cuối cùng. Sau đó, mức trung bình mà chúng tôi muốn là mức trung bình của mỗi cặp được lấy từ hai danh sách. Chúng tôi sử dụng zipđể lấy các cặp từ hai danh sách. Tôi giả sử bạn muốn xem số thập phân trong kết quả, mặc dù giá trị đầu vào của bạn là số nguyên. Theo mặc định, Python thực hiện phép chia số nguyên: nó loại bỏ phần còn lại. Để phân chia mọi thứ thông qua tất cả các cách, chúng ta cần sử dụng số dấu phẩy động. May mắn thay, chia một int cho một float sẽ tạo ra một float, vì vậy chúng tôi chỉ sử dụng 2.0cho ước số của mình thay vì 2. Như vậy: averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]Câu hỏi 2: Việc sử dụng sumsẽ hoạt động tốt. Các hoạt động sau: a = range(10) # [0,1,2,3,4,5,6,7,8,9] b = sum(a) print b # Prints 45Ngoài ra, bạn không cần phải gán mọi thứ cho một biến ở mỗi bước trên đường đi. print sum(a)hoạt động tốt. Bạn sẽ phải cụ thể hơn về chính xác những gì bạn đã viết và cách nó không hoạt động. 296 hữu ích 5 bình luận chia sẻ answer Trần Anh Tú · Trần Anh Tú 02:04 06/12/2010 Tổng danh sách các số: sum(list_of_nums)Tính một nửa của n và n - 1 (nếu tôi có mẫu đúng), sử dụng danh sách dễ hiểu : [(x + (x - 1)) / 2 for x in list_of_nums]Tính tổng các phần tử liền kề, ví dụ ((1 + 2) / 2) + ((2 + 3) / 2) + ... bằng cách sử dụng giảm thiểu và lambdas reduce(lambda x, y: (x + y) / 2, list_of_nums)127 hữu ích 3 bình luận chia sẻ answer Nguyễn Xuân Tùng · Nguyễn Xuân Tùng 12:19 12/07/2016 Câu hỏi 2: Để tính tổng một danh sách các số nguyên: a = [2, 3, 5, 8] sum(a) # 18 # or you can do: sum(i for i in a) # 18Nếu danh sách chứa các số nguyên dưới dạng chuỗi: a = ['5', '6'] # import Decimal: from decimal import Decimal sum(Decimal(i) for i in a)77 hữu ích 2 bình luận chia sẻ answer Đặng Kim Yến · Đặng Kim Yến 11:17 12/07/2017 Bạn có thể thử cách này: a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)] print(sm) # Python 3 print sm # Python 236 hữu ích 3 bình luận chia sẻ answer Lý Trường Vinh · Lý Trường Vinh 23:06 01/06/2015 >>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
File " Có vẻ như nó sumđã được xác định trong mã ở đâu đó và ghi đè lên chức năng mặc định. Vì vậy, tôi đã xóa nó và vấn đề đã được giải quyết. 28 hữu ích 0 bình luận chia sẻ answer Nguyễn Mỹ Khuyên · Nguyễn Mỹ Khuyên 15:00 13/01/2016 Sử dụng một đơn giản list-comprehensionvà sum: 16 hữu ích 2 bình luận chia sẻ answer Trịnh Xuân Huy · Trịnh Xuân Huy 09:35 08/01/2016 Tất cả các câu trả lời đều cho thấy một cách tiếp cận chung và có lập trình. Tôi đề xuất một cách tiếp cận toán học cụ thể cho trường hợp của bạn. Đặc biệt, nó có thể nhanh hơn đối với các danh sách dài. Nó hoạt động vì danh sách của bạn là danh sách các số tự nhiên lên đến n: Giả sử chúng ta có các số tự nhiên 1, 2, 3, ..., 10: >>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]Bạn có thể sử dụng sumchức năng trên một danh sách: >>> print sum(nat_seq) 55Bạn cũng có thể sử dụng công thức n*(n+1)/2trong đó ngiá trị của phần tử cuối cùng trong danh sách (tại đây nat_seq[-1]:), vì vậy bạn tránh lặp lại các phần tử: >>> print (nat_seq[-1]*(nat_seq[-1]+1))/2 55Để tạo chuỗi, (1+2)/2, (2+3)/2, ..., (9+10)/2bạn có thể sử dụng trình tạo và công thức (2*k-1)/2.(lưu ý dấu chấm để tạo các giá trị dấu chấm động). Bạn phải bỏ qua phần tử đầu tiên khi tạo danh sách mới: >>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]] >>> print new_seq [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]Tại đây, bạn có thể sử dụng sumchức năng trong danh sách đó: >>> print sum(new_seq) 49.5Nhưng bạn cũng có thể sử dụng công thức (((n*2+1)/2)**2-1)/2, vì vậy bạn có thể tránh lặp lại các phần tử: >>> print (((new_seq[-1]*2+1)/2)**2-1)/2 49.514 hữu ích 0 bình luận chia sẻ answer Bùi Xuân Trường · Bùi Xuân Trường 06:51 30/10/2019 Câu hỏi này đã được trả lời ở đây a = [1,2,3,4] sum(a)sum (a) trả về 10 9 hữu ích 1 bình luận chia sẻ answer Võ Quế Thu · Võ Quế Thu 09:38 12/02/2016 Cách đơn giản nhất để giải quyết vấn đề này: l =[1,2,3,4,5] sum=0 for element in l: sum+=element print sum6 hữu ích 0 bình luận chia sẻ answer Bùi Thanh Nga · Bùi Thanh Nga 18:19 04/12/2019 Rất nhiều giải pháp, nhưng giải pháp yêu thích của tôi vẫn còn thiếu: >>> import numpy as np >>> arr = np.array([1,2,3,4,5])một mảng numpy không quá khác với một danh sách (trong trường hợp sử dụng này), ngoại trừ việc bạn có thể coi các mảng như số: >>> ( arr[:-1] + arr[1:] ) / 2.0 [ 1.5 2.5 3.5 4.5]Làm xong! giải trình Các chỉ số ưa thích có nghĩa là: [1:]bao gồm tất cả các phần tử từ 1 đến cuối (do đó bỏ qua phần tử 0) và [:-1]là tất cả các phần tử ngoại trừ phần tử cuối cùng: >>> arr[:-1] array([1, 2, 3, 4]) >>> arr[1:] array([2, 3, 4, 5])Vì vậy, thêm hai phần đó sẽ cho bạn một mảng bao gồm các phần tử (1 + 2), (2 + 3), v.v. Lưu ý rằng tôi đang chia cho 2.0, không phải 2vì nếu không Python tin rằng bạn chỉ sử dụng số nguyên và tạo ra kết quả số nguyên được làm tròn. lợi thế của việc sử dụng numpy NumPy có thể nhiều nhanh hơn so với vòng xung quanh danh sách các số. Tùy thuộc vào mức độ lớn của danh sách của bạn, một số thứ tự về mức độ nhanh hơn. Ngoài ra, nó ít mã hơn rất nhiều và ít nhất đối với tôi, nó dễ đọc hơn. Tôi đang cố gắng tạo thói quen sử dụng numpy cho tất cả các nhóm số và đó là một cải tiến rất lớn đối với tất cả các vòng lặp và vòng lặp trong vòng lặp mà tôi lẽ ra phải viết. 5 hữu ích 0 bình luận chia sẻ answer Lê Nhật Quang · Lê Nhật Quang 12:15 16/07/2017 import numpy as np x = [1,2,3,4,5] [(np.mean((x[i],x[i+1]))) for i in range(len(x)-1)] # [1.5, 2.5, 3.5, 4.5] 3 hữu ích 0 bình luận chia sẻ answer Đặng Phúc Thịnh · Đặng Phúc Thịnh 02:48 06/12/2010 Trình tạo là một cách dễ dàng để viết điều này: from __future__ import division # ^- so that 3/2 is 1.5 not 1 def averages( lst ): it = iter(lst) # Get a iterator over the list first = next(it) for item in it: yield (first+item)/2 first = item print list(averages(range(1,11))) # [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]3 hữu ích 2 bình luận chia sẻ answer Nguyễn Danh Sơn · Nguyễn Danh Sơn 00:03 11/04/2019 Hãy để chúng tôi tạo điều kiện dễ dàng cho Người mới bắt đầu: -
message = "This is a global!" def main(): global message message = "This is a local" print(message) main() # outputs "This is a local" - From the Function call print(message) # outputs "This is a local" - From the Outer scope Khái niệm này được gọi là Shadowing
nums = [1, 2, 3, 4, 5] var = 0 def sums(): for num in nums: global var var = var + num print(var) if __name__ == '__main__': sums() Kết quả đầu ra = 15 3 hữu ích 0 bình luận chia sẻ answer Trần Vân Phi · Trần Vân Phi 09:37 06/12/2010 Sử dụng pairwise công thức itertools : import itertools def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return itertools.izip(a, b) def pair_averages(seq): return ( (a+b)/2 for a, b in pairwise(seq) )2 hữu ích 0 bình luận chia sẻ answer Tạ Bích Trâm · Tạ Bích Trâm 21:31 28/01/2011 Ngắn gọn và đơn giản: def ave(x,y): return (x + y) / 2.0 map(ave, a[:-1], a[1:])Và đây là cách nó trông: >>> a = range(10) >>> map(ave, a[:-1], a[1:]) [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]Do một số sai lầm trong cách Python xử lý maphơn hai danh sách, bạn phải cắt bớt danh sách a[:-1],. Nó hoạt động nhiều hơn như bạn mong đợi nếu bạn sử dụng itertools.imap: >>> import itertools >>> itertools.imap(ave, a, a[1:])2 hữu ích 3 bình luận chia sẻ answer Đỗ Tuyết Oanh · Đỗ Tuyết Oanh 18:59 04/12/2019 Trong Python 3.8, toán tử gán mới có thể được sử dụng >>> my_list = [1, 2, 3, 4, 5] >>> itr = iter(my_list) >>> a = next(itr) >>> [(a + (a:=x))/2 for x in itr] [1.5, 2.5, 3.5, 4.5]alà một tham chiếu đang chạy tới giá trị trước đó trong danh sách, do đó nó được khởi tạo cho phần tử đầu tiên của danh sách và quá trình lặp xảy ra trên phần còn lại của danh sách, cập nhật asau khi nó được sử dụng trong mỗi lần lặp. Một trình lặp rõ ràng được sử dụng để tránh phải tạo bản sao của danh sách bằng cách sử dụng my_list[1:]. 2 hữu ích 0 bình luận chia sẻ answer Phạm Hòa An · Phạm Hòa An 08:38 29/12/2019 Bạn cũng có thể làm tương tự bằng cách sử dụng đệ quy: Đoạn mã Python: def sumOfArray(arr, startIndex): size = len(arr) if size == startIndex: # To Check empty list return 0 elif startIndex == (size - 1): # To Check Last Value return arr[startIndex] else: return arr[startIndex] + sumOfArray(arr, startIndex + 1) print(sumOfArray([1,2,3,4,5], 0))2 hữu ích 0 bình luận chia sẻ answer Nguyễn Hải Phong · Nguyễn Hải Phong 09:36 11/12/2016 Tôi sử dụng một whilevòng lặp để nhận được kết quả: i = 0 while i < len(a)-1: result = (a[i]+a[i+1])/2 print result i +=11 hữu ích 0 bình luận chia sẻ answer Võ Đăng Khôi · Võ Đăng Khôi 22:23 08/07/2017 Lặp qua các phần tử trong danh sách và cập nhật tổng số như sau: def sum(a): total = 0 index = 0 while index < len(a): total = total + a[index] index = index + 1 return total1 hữu ích 0 bình luận chia sẻ answer Võ Thiện Ngôn · Võ Thiện Ngôn 15:54 31/03/2019 Cảm ơn Karl Knechtel tôi đã có thể hiểu câu hỏi của bạn. Lời giải thích của tôi:
Câu hỏi đầu tiên sử dụng hàm ẩn danh (còn gọi là. Lambda function): s = lambda l: [(l[0]+l[1])/2.] + s(l[1:]) if len(l)>1 else [] #assuming you want result as float s = lambda l: [(l[0]+l[1])//2] + s(l[1:]) if len(l)>1 else [] #assuming you want floor resultCâu hỏi thứ hai cũng sử dụng hàm ẩn danh (còn gọi là. Lambda function): p = lambda l: l[0] + p(l[1:]) if l!=[] else 0Cả hai câu hỏi được kết hợp trong một dòng mã: s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0 #assuming you want result as float s = lambda l: (l[0]+l[1])/2. + s(l[1:]) if len(l)>1 else 0 #assuming you want floor resultsử dụng cái phù hợp nhất với nhu cầu của bạn 1 hữu ích 0 bình luận chia sẻ answer Trịnh Bình Nguyên · Trịnh Bình Nguyên 02:07 06/12/2010 Hãy thử sử dụng khả năng hiểu danh sách. Cái gì đó như: new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]0 hữu ích 1 bình luận chia sẻ answer Trần Hải Uy · Trần Hải Uy 07:58 06/12/2010 Theo tinh thần của itertools. Cảm hứng từ công thức cặp đôi. from itertools import tee, izip def average(iterable): "s -> (s0,s1)/2.0, (s1,s2)/2.0, ..." a, b = tee(iterable) next(b, None) return ((x+y)/2.0 for x, y in izip(a, b))Ví dụ: >>>list(average([1,2,3,4,5])) [1.5, 2.5, 3.5, 4.5] >>>list(average([1,20,31,45,56,0,0])) [10.5, 25.5, 38.0, 50.5, 28.0, 0.0] >>>list(average(average([1,2,3,4,5]))) [2.0, 3.0, 4.0]0 hữu ích 0 bình luận chia sẻ answer Dương Cao Sơn · Dương Cao Sơn 09:38 21/01/2015 Tôi chỉ sử dụng lambda với map () a = [1,2,3,4,5,6,7,8,9,10] b = map(lambda x, y: (x+y)/2.0, fib[:-1], fib[1:]) print b0 hữu ích 0 bình luận chia sẻ answer Vũ Nhật Hùng · Vũ Nhật Hùng 12:17 12/08/2015 n = int(input("Enter the length of array: ")) list1 = [] for i in range(n): list1.append(int(input("Enter numbers: "))) print("User inputs are", list1) list2 = [] for j in range(0, n-1): list2.append((list1[j]+list1[j+1])/2) print("result = ", list2) 0 hữu ích 0 bình luận chia sẻ answer Phạm Thanh Hà · Phạm Thanh Hà 04:43 17/01/2019 Một cách đơn giản là sử dụng hoán vị iter_tools # If you are given a list numList = [1,2,3,4,5,6,7] # and you are asked to find the number of three sums that add to a particular number target = 10 # How you could come up with the answer? from itertools import permutations good_permutations = [] for p in permutations(numList, 3): if sum(p) == target: good_permutations.append(p) print(good_permutations)Kết quả là: [(1, 2, 7), (1, 3, 6), (1, 4, 5), (1, 5, 4), (1, 6, 3), (1, 7, 2), (2, 1, 7), (2, 3, 5), (2, 5, 3), (2, 7, 1), (3, 1, 6), (3, 2, 5), (3, 5, 2), (3, 6, 1), (4, 1, 5), (4, 5, 1), (5, 1, 4), (5, 2, 3), (5, 3, 2), (5, 4, 1), (6, 1, 3), (6, 3, 1), (7, 1, 2), (7, 2, 1)]Lưu ý rằng thứ tự quan trọng - nghĩa là 1, 2, 7 cũng được hiển thị dưới dạng 2, 1, 7 và 7, 1, 2. Bạn có thể giảm điều này bằng cách sử dụng một tập hợp. 0 hữu ích 0 bình luận chia sẻ answer Huỳnh Hoài Giang · Huỳnh Hoài Giang 17:19 05/07/2016 Hãy thử những điều sau - mylist = [1, 2, 3, 4] def add(mylist): total = 0 for i in mylist: total += i return total result = add(mylist) print("sum = ", result)-3 hữu ích 3 bình luận chia sẻ Xem nguồn: https://stackoverflow.com/questions/4362586/sum-a-list-of-numbers-in-python |