파이썬에서 숫자의 목록을 합치십시오


367

과 같은 숫자 목록이 있으며 두 번째 와 세 번째 등 [1,2,3,4,5...]을 계산 (1+2)/2하고 싶습니다 . 어떻게해야합니까?(2+3)/2(3+4)/2

첫 번째 숫자를 두 번째 숫자와 합산하여 2로 나누고 두 번째 숫자를 세 번째와 합산하고 2로 나누고 싶습니다.

또한 숫자 목록을 어떻게 합칠 수 있습니까?

a = [1, 2, 3, 4, 5, ...]

그렇습니까?

b = sum(a)
print b

하나의 숫자를 얻으려면?

이것은 나를 위해 작동하지 않습니다.


이 목록은 얼마나 걸립니까? 0과 1 사이의 값은 얼마나 무작위입니까?
kevpie

2
파이썬을 망칠 수 있기 전에 합계를 정의하면 del sum을 시도하십시오. 어쩌면 코드 어딘가에 정의되어 기본 기능을 덮어 씁니다. 그래서 나는 그것을 삭제하고 문제가 해결되었습니다. (answer4183543)
NicoKowe '

1
"이 작동하지 않습니다"는 문제 설명이 아닙니다.
Lorne의 후작

답변:


279

질문 1 : (요소 0 + 요소 1) / 2, (요소 1 + 요소 2) / 2 등을 원합니다.

첫 번째 요소를 제외한 모든 요소 중 하나와 마지막 요소를 제외한 모든 요소 중 하나의 두 가지 목록을 만듭니다. 그런 다음 원하는 평균은 두 목록에서 가져온 각 쌍의 평균입니다. 우리 zip는 두 목록에서 쌍을 취하는 데 사용 합니다.

입력 값이 정수 임에도 불구하고 결과에서 소수를보고 싶다고 가정합니다. 기본적으로 파이썬은 정수 나누기를 수행합니다. 나머지는 버립니다. 사물을 완전히 나누려면 부동 소수점 숫자를 사용해야합니다. 다행스럽게도 int를 float로 나누면 float이 만들어 지므로 2.0제수 대신을 사용 2합니다.

그러므로:

averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]

질문 2 :

그 사용은 sum잘 작동합니다. 다음과 같이 작동합니다.

a = range(10)
# [0,1,2,3,4,5,6,7,8,9]
b = sum(a)
print b
# Prints 45

또한 모든 단계에서 변수에 모든 것을 할당 할 필요는 없습니다. print sum(a)잘 작동합니다.

작성한 내용과 작동하지 않는 방식에 대해 더 구체적으로 설명해야합니다.


나는 첫 번째 질문에 대해 my_list undefined를 얻지 못했습니다. 내 프로그램에서 1, 2, 3, 4가 아닌 난수입니다. 두 번째 질문에 대해 저와 함께 작동하지 않습니다. 이유를 모르겠습니다
layo

37
my_list정의한 경우에만 정의됩니다. 그것은 당신이 일하려고하는 목록이라고 부르는 모든 것에 대한 자리 표시 자였습니다. 당신이 뭐라고했는지 짐작할 수 없습니다.
Karl Knechtel

2
6 년 후에도이 게시물은 여전히 ​​사람들을 돕고 있습니다. 내 코드에 결함이 있었고 게시물을 사용하여 내 코드의 관련 개념이 올바른지 확인할 수 있었으므로 문제는 다른 곳에 있어야합니다. 그런 다음 찾았습니다. 당신과 질문을 한 사람에게 빠른 투표로 투표권을 주셨습니다. 최고의 소원.
TMWP

1
@KarlKnechtel 그는 그의 질문에리스트를 가지고 있었고 " a" 라고 불렸다 .
HelloGoodbye 18

1
zip더 짧은 인수 끝에 도달하면 중지 되므로 zip(my_list, my_list[1:])충분합니다.
chepner

115

숫자의 합계 목록 :

sum(list_of_nums)

목록 이해를 사용하여 n 및 n -1의 절반 계산 (패턴이 올바른 경우) :

[(x + (x - 1)) / 2 for x in list_of_nums]

reducelambdas를 사용하여 ((1 + 2) / 2) + ((2 + 3) / 2) + ... 인접한 요소 합

reduce(lambda x, y: (x + y) / 2, list_of_nums)

4
나는 그가 인접한 요소를 합치고 싶다고 생각합니다. 의 평균을 복용 아무 소용이 없을 것입니다 xx - 1; 대신 0.5를 빼면됩니다.
Karl Knechtel

4
감소 기능은 게시물의 내용을 수행하지 않습니다. (((a1 + a2) / 2 + a3) / 2 + a4) / 2 ...
Moberg

from functools import reduce
tyrex

70

질문 2 : 정수 목록을 합치려면 :

a = [2, 3, 5, 8]
sum(a)
# 18
# or you can do:
sum(i for i in a)
# 18

목록에 정수가 문자열로 포함 된 경우 :

a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)

4
sum(i for i in a)중복됩니다.
장 프랑수아 파브르

6
sum(Decimal(i) for i in a)=> sum(int(i) for i in a)또는sum(map(int,a))
Jean-François Fabre

34

이 방법으로 시도 할 수 있습니다 :

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

4
이런 식으로 사본을 만들 필요가 없으며 끔찍한 비현실적입니다. 모든 투표에도 불구하고 전염병처럼 피하십시오 ...
Jean-François Fabre

@ Jean-FrançoisFabre 댓글을 남겨주세요 왜 "끔찍한 언 파이 토닉"입니까?
PierreF

초보자 a[0:len(a)]는의 사본을 만듭니다 a.CPU 및 메모리 낭비 외에 요점은 무엇입니까? 그런 다음 print(sm)파이썬 2에서도 작동합니다 .2017 년 중반에 왜 그렇게 많은 투표를했는지 이해가되지 않습니다 ... 그러나 대부분의 답변에 적용됩니다.
Jean-François Fabre

27
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45

sum코드 어딘가에 정의되어 있으며 기본 기능을 덮어 쓴 것 같습니다 . 그래서 나는 그것을 삭제하고 문제가 해결되었습니다.


16

간단 list-comprehension하고 sum:

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

4
[및 을 사용할 필요는 없습니다 ]. 생성기 표현 만 전달하면됩니다.sum(i/2. for i in range(x))
Ivan

1
sum(range(x)) / 2.모든 분할을 피하고 결국에는 나누십시오.
장 프랑수아 파브르

13

모든 답변은 프로그램적이고 일반적인 접근 방식을 보여주었습니다. 귀하의 경우에 맞는 수학적 접근법을 제안합니다. 긴 목록의 경우 특히 빠를 수 있습니다. 목록이 최대 자연수 목록이기 때문에 작동합니다 n.

자연수가 있다고 가정 해 봅시다 1, 2, 3, ..., 10.

>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

sum목록에서이 기능을 사용할 수 있습니다 .

>>> print sum(nat_seq)
55

또한 공식 사용할 수 있습니다 : (여기에 목록의 마지막 요소의 값입니다 당신이 요소를 통해 반복하는을 피할 수 있도록)n*(n+1)/2nnat_seq[-1]

>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55

시퀀스를 생성하려면 (1+2)/2, (2+3)/2, ..., (9+10)/2생성기와 수식을 사용할 수 있습니다 (2*k-1)/2.(점을 참고하여 값을 부동 소수점으로 설정). 새 목록을 생성 할 때 첫 번째 요소를 건너 뛰어야합니다.

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

여기에서도 sum해당 목록 의 기능을 사용할 수 있습니다 .

>>> print sum(new_seq)
49.5

그러나 formula를 사용할 수도 (((n*2+1)/2)**2-1)/2있으므로 요소 반복을 피할 수 있습니다.

>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5

6

이 문제를 해결하는 가장 간단한 방법 :

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum


3
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

생성기는 이것을 작성하는 쉬운 방법입니다.

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]

정수 나누기를 피하기 위해 2.0으로 나눌 수도 있습니다.
Chris Anderson

파이썬 3에서는 @ChrisAnderson이 true가 아닙니다. 부동 소수점 나누기가 기본값입니다.
저스틴 메이 너

3

초보자를 위해 쉽게 만들자 :-

  1. global키워드는 새 로컬 변수를 생성하지 않고 전역 변수 메시지가 주 함수 내에서 할당 할 수 있습니다
    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

이 개념을 그림자 라고합니다

  1. 파이썬에서 숫자의 목록을 합치십시오
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()

출력 = 15


2

은 Using pairwise 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

짧고 간단한

def ave(x,y):
  return (x + y) / 2.0

map(ave, a[:-1], a[1:])

그리고 그 모습은 다음과 같습니다.

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

파이썬이 map두 개 이상의 목록을 처리하는 방식에 약간의 어리 석음이 있기 때문에 목록을 잘라야합니다 a[:-1]. 다음을 사용하면 예상대로 더 잘 작동합니다 itertools.imap.

>>> import itertools
>>> itertools.imap(ave, a, a[1:])
<itertools.imap object at 0x1005c3990>
>>> list(_)
[0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]

짧습니다. 단순한? 수행중인 작업을 이해하려면 긴 솔루션보다 긴 설명이 필요합니다.
tekHedd

이로 인해 부동 소수점 누적 오류가 발생합니다. 대신에 나누십시오.
장 프랑수아 파브르

1
@ Jean-FrançoisFabre 두 방법 모두 불완전합니다. 결국에는 나누면 많은 수의 오버플로가 발생하며 솔루션은 데이터 (및 사용 사례)에 따라 다릅니다.
cz

2

너무 많은 솔루션이지만 여전히 가장 좋아하는 솔루션이 없습니다.

>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])

numpy 배열은 배열을 숫자와 같이 취급 할 수 있다는 점을 제외하고 (이 경우에는) 목록과 크게 다르지 않습니다.

>>> ( arr[:-1] + arr[1:] ) / 2.0
[ 1.5  2.5  3.5  4.5]

끝난!

설명

팬시 인덱스는 이것을 의미합니다 : [1:]1에서 끝까지의 모든 요소를 ​​포함하므로 (요소 0을 생략) [:-1]마지막 요소를 제외한 모든 요소입니다.

>>> arr[:-1]
array([1, 2, 3, 4])
>>> arr[1:]
array([2, 3, 4, 5])

따라서이 두 개를 추가하면 elemens (1 + 2), (2 + 3) 등으로 구성된 배열이 제공됩니다. 파이썬은 당신이 정수 만 사용하고 둥근 정수 결과를 생성한다고 믿기 때문에으로 나누지 2.0않습니다 2.

numpy 사용의 이점

Numpy는 숫자 목록을 둘러싼 루프보다 훨씬 빠릅니다. 목록의 크기에 따라 몇 배 더 빠릅니다. 또한 코드가 훨씬 적고 적어도 나에게는 읽기 쉽습니다. 나는 모든 수의 그룹에 numpy를 사용하는 습관을 없애려고 노력하고 있으며, 그렇지 않으면 다른 루프와 루프 내 루프에 대해 크게 개선되었습니다.


1

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

1

while루프를 사용 하여 결과를 얻습니다.

i = 0
while i < len(a)-1:
   result = (a[i]+a[i+1])/2
   print result
   i +=1

1

목록의 요소를 반복하고 다음과 같이 총계를 업데이트하십시오.

def sum(a):
    total = 0
    index = 0
    while index < len(a):
        total = total + a[index]
        index = index + 1
    return total

1

Karl Knechtel 덕분에 귀하의 질문을 이해할 수있었습니다. 내 해석 :

  1. 요소 i 및 i + 1의 평균을 가진 새 목록을 원합니다.
  2. 목록의 각 요소를 합치려고합니다.

익명 함수 (일명 Lambda 함수)를 사용하는 첫 번째 질문 :

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

익명 함수 (일명 Lambda 함수)를 사용하는 두 번째 질문 :

p = lambda l: l[0] + p(l[1:]) if l!=[] else 0

질문 모두 한 줄의 코드로 결합되었습니다.

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

가장 적합한 것을 사용하십시오


1

재귀를 사용하여 동일한 작업을 수행 할 수도 있습니다.

파이썬 스 니펫 :

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

0

목록 이해력을 사용해보십시오. 다음과 같은 것 :

new_list = [(old_list[i] + old_list[i+1])/2 for i in range(len(old_list-1))]

@Rafe 그것은 작동하는 것입니다 (우리가 끝에 괄호를 고치면-해야합니다 range(len(old_list) - 1)), Pythonistas는 일반적으로 'range'와 'len'의 조합에 눈살을 찌푸립니다. "할 수있는 유일한 방법이 있어야한다"라는 결론은 "표준 라이브러리는 추악한 일을 피할 수있는 방법을 제공하는 것"입니다. 간접 반복-일련의 숫자를 반복하므로 해당 숫자를 사용하여 실제로 반복하려는 항목을 색인화 할 수 있습니다.
Karl Knechtel

0

itertools의 정신으로. pairwise 레시피에서 영감을 얻습니다.

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

예 :

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

간단한 방법은 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)

결과는 다음과 같습니다.

[(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)]

1, 2, 7을 의미하는 순서는 2, 1, 7 및 7, 1, 2로 표시됩니다. 세트를 사용하여이를 줄일 수 있습니다.


0

Python 3.8에서는 새로운 할당 연산자를 사용할 수 있습니다

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

a는 목록 의 이전 값에 대한 실행 참조 이므로 목록의 첫 번째 요소로 초기화되고 반복 은 목록 의 나머지 부분 에서 발생하며 a각 반복에서 사용 된 후에 업데이트 됩니다.

명시 적 반복자는를 사용하여 목록의 복사본을 만들 필요가 없도록하는 데 사용 my_list[1:]됩니다.


-3

다음을 시도하십시오-

mylist = [1, 2, 3, 4]   

def add(mylist):
    total = 0
    for i in mylist:
        total += i
    return total

result = add(mylist)
print("sum = ", result)

2
새로운 답변은 기존 답변과 뚜렷이 달라야합니다. 또한 sum함수는 기본 제공 sum동작이나 이름 과 다르지 않습니다 . 실제로 답변에서 함수 정의를 삭제할 수 있으며 여전히 작동합니다.
누 메논

당신은 지금 확인하실 수 있습니다
Sai G

2
답변을 개선해 주셔서 감사합니다. 변수 이름은 더 설명하기 쉽고 내장 기능을 가리지 않습니다. 그러나 근본적인 문제는 여전히 존재합니다. for-loop 방식은 이미 stackoverflow.com/a/35359188/733092의해 제공 되었으며이 기능은 내장 기능과 중복됩니다 sum. 질문에 올바르게 대답하기 위해 테스트에서 A를 얻지 만 StackOverflow 답변은 이 페이지에 도착하는 사람들에게 유용 해야 하며 중복 답변은 그렇지 않습니다.
누 메논
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.