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 45

Ngoà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] # 18

Nế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 2

36 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 "", line 1, in TypeError: 'int' object is not callable >>> del sum >>> sum[a] 45

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:

>> sum[i for i in range[x]]/2. #if x = 10 the result will be 22.5

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

Bạ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.5

Như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.5

14 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 sum

6 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: -

  1. Các globaltừ khóa sẽ cho phép nhắn biến toàn cầu được giao trong phạm vi chức năng chính mà không tạo ra một biến địa phương mới
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

  1. Tính tổng danh sách các số trong Python
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:]] >>> list[_] [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

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 +=1

1 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 total

1 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:

  1. Bạn muốn một danh sách mới với giá trị trung bình của phần tử i và i + 1.
  2. Bạn muốn tính tổng từng phần tử trong danh sách.

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 result

Câ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 0

Cả 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 result

sử 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 b

0 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: //stackoverflow.com/questions/4362586/sum-a-list-of-numbers-in-python

Video liên quan

Chủ Đề