2014-09-13 135 views
0

我有一種建立在以下方式中的數據文件:排序(和排序)不排序

SOURCE_ID,target_id,印象數,點擊

上,我加入以下欄目:

  • 對 - 源的元組和目標
  • CTR - 基本上點擊/展示
  • 下界
  • 上限

下限/上限是計算值(這與我的問題無關,但對於好奇的these are the bounds for the Wilson confidence interval

事情是,我試圖按下限(位置= 6)降序排列列表。嘗試了幾個東西(排序/排序,使用lambda與使用itemgetter,創建一個新的列表w/o標題,並嘗試排序),仍然沒有任何變化。我有下面的代碼。

import csv 
from math import sqrt 
from operator import itemgetter 

#----- Read CSV ---------------------------------------------------------------- 
raw_data_csv = open('rawdile', "rb") 
raw_reader = csv.reader(raw_data_csv) 

# transform the values to ints. 
raw_data = [] 
for rownum,row in enumerate(list(raw_reader)): 
    if rownum == 0:                # Header 
     raw_data.append(row) 
    else: 
     r = []               # Col header 
     r.extend([int(x) for x in row])          # Transforming the values to ints 
     raw_data.append(r) 



# Add cols for pairs (as tuple) and CTR 
raw_data[0].append("pair") 


for row in raw_data[1:]: 
    row.append((row[0],row[1]))   # tuple 
# row.append(float(row[3])/row[2]) # CTR 



# ------------------------------------------------------------------------------ 


z = 1.95996398454005 


def confidence(n, clicks): 

    if n == 0: 
     return 0 
    phat = float(clicks)/n 
    l_bound = ((phat + z*z/(2*n) - z * sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n))  # lower bound 
    u_bound = ((phat + z*z/(2*n) + z * sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n))  # upper bound 
    return phat, l_bound, u_bound 


raw_data[0].extend(["CTR","Lower Bound","Upper Bound"]) 


for row in raw_data[1:]: 
    phat, l_bound, u_bound = confidence(row[2],row[3]) 
    row.extend([phat, l_bound, u_bound]) 



# raw_data[1:].sort(key=lambda x: x[6], reverse=True) 

sorted(raw_data[1:], key=itemgetter(6), reverse=True) 



outputfile= open('outputfile.csv', 'wb') 
wr = csv.writer(outputfile,quoting = csv.QUOTE_ALL) 

wr.writerows(raw_data) 


raw_data_csv.close() 
outputfile.close() 

有人可以說出原因嗎? 謝謝!

+3

'sorted()'返回一個*新列表*但您忽略了這一點。你說你也嘗試過'list.sort()';你能告訴我們你是怎麼做到的嗎? – 2014-09-13 15:41:30

+0

嗨 - 謝謝你的回覆。它剛剛在上面註釋掉了。 – Optimesh 2014-09-13 16:02:21

+0

(就在排序()行之上)。如果我需要將sorted()的結果分配給一個新列表 - 在新列表中使用標題的最優雅方式是什麼?我用new_list.insert(0,raw_data [0])。 (哦 - 我用new_list分配排序(),它的工作:)) – Optimesh 2014-09-13 16:09:52

回答

2

您正在整理一個切片(嘗試創建一個新的列表對象),並在另一次嘗試中忽略返回值sorted()

你不能對這樣的列表進行排序;通過連接創建一個新列表來代替:

rows = rows[:1] + sorted(raw_data[1:], key=itemgetter(6), reverse=True) 
+0

謝謝!如果我想要排序,它會是什麼樣子?使用itemgetter或lambda更好嗎? – Optimesh 2014-09-13 16:59:44

+0

@Optimesh:然後*從列表中刪除*第一行; 'header = rows.pop(0)'也許。 – 2014-09-13 17:04:12