2014-09-13 126 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