0

クエリの数とログからの広告の数をカウントするための Python コードを作成しました。

たとえば、(google, 16, 35)wheregoogleはクエリを16意味し、クエリ番号を35意味し、広告番号を意味します。

私は 2 つの辞書を定義することを考えましquery->query_numberquery->advertisement

しかし、複雑すぎるようquery, query_num, advertisement_numです。単一の辞書に格納することは可能ですか?

if match[0].strip():
     if not dict.has_key(match[0]):
        dict[match[0]] = 1
     else:
        dict[match[0]] +=1

このコードは queryNum を計算するために使用されますが、まだ adver_count を保存する必要があります。どうすればよいですか?

クラスを使用してquery_numとadver_numを格納しました。これが私のコードです。adver_numに従って降順ソートを行うにはどうすればよいですか?誰が私を助けることができますか?ありがとう

import re
dict={}
class log:
    def __init__(self,query_num, adver_num):
        self.query_num = query_num
        self.adver_num = adver_num
f = open('result.txt','w')

def sort_by_value(d):
   return sorted(d.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)

for line in open("test.log"):
   count_result = 0
   query_num = 0
   match=re.search('.*qry=(.*?)qid0.*rc=(.*?)discount',line).groups()
   counts=match[1].split('|')
   for count in counts:
      count_result += int(count)
   if match[0].strip():
     if not dict.has_key(match[0]):
        dict[match[0]] = log(1,count_result)
     else:
        query_num = dict[match[0]].query_num+1;
        count_result = dict[match[0]].adver_num+count_result;
        dict[match[0]] = log(query_num,count_result)
     #f.write("%s\t%s\n"%(match[0],count_result))

sort_by_value(dict)

for i in dict.keys():
    f.write("%s\t%s\t%s\n"%(i,dict[i].query_num,dict[i].adver_num))
4

4 に答える 4

1

キーとしてdict を 1 つだけ使用し、値としてqueryタプル(query_num, advertisement_num)を使用できます。

コード例:

queryNum を計算するとき、

if match[0].strip():
    if not dict.has_key(match[0]):
        dict[match[0]] = (1,0)
    else:
        qnum, adnum = dict[match[0]]
        dict[match[0]] = (qnum + 1, adnum)
于 2013-08-20T08:34:16.473 に答える
0

自分用のクラスを作成できます。

class YourClass:
    def __init__(self, query, query_num, adver_num):
        self.query = query
        self.query_num = query_num
        self.adver_num = adver_num

次のように処理できます。

your_dictionary['google'] = YourClass('google', 16, 35)

そして、次のような値にアクセスします。

print your_dictionary['google'].query, your_dictionary['google'].query_num, your_dictionary['google'].adver_num
于 2013-08-20T08:36:31.940 に答える
0

はい、できます。キーとして使用queryすると、タプルを辞書の値として簡単に使用できます。

d = {"google": (16, 35)}

辞書を値として使用することもできます。

d = {"google": {"query number": 16, "advertisement number": 35}}
于 2013-08-20T08:36:45.777 に答える
-1

次のように itertools チェーンを使用して、クエリ セットを 1 つの同じリストに保存できます。

#Import itertools
from itertools import chain
# use itertools chain to store your querysets into a list/variable like "store" 
store = list(chain(query_num, advertisement_num))
于 2013-08-20T08:38:33.507 に答える