2012-05-18 3 views
-1

내가 형식의 튜플의 목록이 있습니다파이썬에서 튜플 목록의 평균을 계산하려면 어떻게해야합니까?

[을 (보안, 구입 한 주식의 가격, 지불 수) ....]

[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')] 

나는 데이터를 통합 할 수 있습니다. 각 보안은 한 번만 나열됩니다.

[(보안, 유료 평균 가격, 소유 주식수의 이름), ...]

+0

1. 나는 defaultdict로 주위를 엉망으로 만들었고 실제로 아무것도 알아 내지 못했습니다. –

답변

1

출력으로 dictionary을 사용했습니다.

lis=[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')] 

dic={} 
for x in lis: 
    if x[0] not in dic: 
    price=float(x[1].strip('$')) 
    nos=int("".join(x[2].split(','))) 
    #print(nos) 
    dic[x[0]]=[price,nos] 
    else: 
    price=float(x[1].strip('$')) 
    nos=int("".join(x[2].split(','))) 
    dic[x[0]][1]+=nos 
    dic[x[0]][0]=(dic[x[0]][0]+price)/2 
print(dic)  

출력 : 여기

{'AAPL': [638.416, 200], 'OCZ': [5.20855, 39780], 'FOSL': [52.033, 1000], 'MSFT': [39.458, 1000]} 
+0

[PEP8] (http://www.python.org/dev/peps/pep-0008/)을 읽어보십시오. – georg

1

그것은 당신이 뭘 하려는지 매우 분명하지 않다. 일부 예제 코드는 여러분이 시도한 것에 대한 정보와 함께 도움이 될 것입니다. 당신의 접근 방식이 잘못되었다고해도, 당신이 목표로하는 것에 대한 모호한 생각을 우리에게 줄 것입니다.

그동안 numpy의 numpy.mean 기능이 문제에 적절합니까? 튜플의 목록을 수적으로 배열로 변환 한 다음 배열의 한 조각에 평균 함수를 적용하는 것이 좋습니다.

즉, 모든 목록과 유사한 데이터 구조에서 작동하며 평균을 수행하려는 액세스를 지정할 수 있습니다.

http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html

편집 :에 NumPy와 사용하여

(name, dollar ammount, weight) 

내가 시작 했죠 : 내가 수집 한 것과

는 튜플의 목록은 다음과 같은 방식으로 데이터를 구성 튜플 목록을 배열로 변환합니다. 거기에서, 첫 번째 열에서 고유 값 (이름)을 찾을 수 있습니다 :

import numpy as np 
a = np.array([(tag, 23.00, 5), (tag2, 25.00, 10)]) 
unique_tags = np.unique(a[0,:]) # note the slicing of the array 

지금 각 태그

meandic = {} 
for element in unique_tags: 
    tags = np.nonzero(a[0,:] == element) # identify which lines are tagged with element 
    meandic[element] = np.mean([t(1) * t(2) for t in a[tags]]) 

이 코드는 테스트되지 않은 것을 유의하시기 바랍니다에 대한 평균을 계산합니다. 작은 세부 사항이 잘못되었을 수 있습니다. 무언가를 알아낼 수 없다면, 그냥 의견을 남기면 기꺼이 실수를 바로 잡을 것입니다. '$'를 제거하고 필요한 경우 문자열을 부동으로 변환해야합니다.

+0

[msft, $ 31, 5), (msft, $ 32, 10), (aapl, $ 100, 1)]이면 출력이 [(msft, 31.75, 15), (aapl, 100, 1))]. 만나다? –

+0

@ ZacharyBurt, 나는 당신의 모범을 이해하지 못한다. 당신은 훨씬 더 분명해야합니다. 이미 작성하려고 시도한 코드를 게시하십시오. 우리가 너를 할 때까지는 우리가 도울 수 없어. – blz

+0

@ ZacharyBurt, 내 의견을 편집하고 있습니다 ;-) – blz

0
>>> lis 
[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')] 
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> for i in lis: 
... amt = float(i[1].strip('$')) 
... num = int(i[2].replace(",", "")) 
... d[i[0]].append((amt,num)) 
... 
>>> for i in d.iteritems(): 
... average_price = sum([s[0] for s in i[1]])/len([s[0] for s in i[1]]) 
... total_shares = sum([s[1] for s in i[1]]) 
... print (i[0],average_price,total_shares) 
... 
('AAPL', 638.416, 200) 
('OCZ', 5.20855, 39780) 
('FOSL', 52.033, 1000) 
('MSFT', 39.458, 1000) 
0

당신은 이동 :

the_list = [('msft', '$31', 5), ('msft','$32', 10), ('aapl', '$100', 1)] 
clean_list = map (lambda x: (x[0],float (x[1][1:]), int(x[2])), the_list) 
out = {} 

for name, price, shares in clean_list: 
    if not name in out: 
     out[name] = [price, shares] 
    else: 
     out[name][0] += price * shares 
     out[name][1] += shares 

# put the output in the requested format 
# not forgetting to calculate avg price paid 
# out contains total # shares and total price paid 

nice_out = [ (name, "$%0.2f" % (out[name][0]/out[name][1]), out[name][1]) 
       for name in out.keys()] 

print nice_out 
>>> [('aapl', '$100.00', 1), ('msft', '$23.40', 15)] 
관련 문제