1

これは長い質問ですので、ご容赦ください。まず、3つのAPIから取得した3つのdictから始めます。dictは次のような構造になっています。

API1 = {'results':[{'url':'www.site.com','title':'A great site','snippet':'This is a great site'},
{'url':'www.othersite.com','title':'Another site','snippet':'This is another site'},
{'url':'www.wiki.com','title':'A wiki site','snippet':'This is a wiki site'}]}

API2 = {'hits':[{'url':'www.dol.com','title':'The DOL site','snippet':'This is the dol site'},
{'url':'www.othersite.com','title':'Another site','snippet':'This is another site'},
{'url':'www.whatever.com','title':'Whatever site','snippet':'This is a site about whatever'}]}

API3 = {'output':[{'url':'www.dol.com','title':'The DOL site','snippet':'This is the dol site'},
{'url':'www.whatever.com','title':'Whatever site','snippet':'This is a site about whatever'},
{'url':'www.wiki.com','title':'A wiki site','snippet':'This is a wiki site'}]}

API1、API2、API3からURLキーを抽出して、処理を行います。これを行うのは、実行する必要のある処理がかなりあり、必要なのはURLだけだからです。終了すると、重複が削除されたURLのリストと、リスト内の各URLの位置に関連するスコアの別のリストがあります。

URLlist = ['www.site.com','www.wiki.com','www.othersite.com','www.dol.com','www.whatever.com']

Results = [1.2, 6.5, 3.5, 2.1, 4.0]

私が行ったことは、zip()関数を使用してこれら2つのリストから新しい辞書を作成することです。

ScoredResults = dict(zip(URLlist,Results))

{'www.site.com':1.2,'www.wiki.com':6.5, 'www.othersite.com':3.5, 'www.dol.com':2.1, 'www.whatever.com':4.0}

今、私がする必要があるのは、URLをからリンクすることですScoredResultsAPI1またはAPI2API3次のような新しい辞書を作成します。

Full Results = 
{'www.site.com':{'title':'A great site','snippet':'This is a great site','score':1.2},
 'www.othersite.com':{'title':'Another site','snippet':'This is another site','score':3.5},
...}

これは私には難しすぎます。私の質問履歴を振り返ると、私は多くの辞書の質問をしてきましたが、これまでのところ実装は機能していません。誰かが私を正しい方向に向けてくれたら、私はそれをとても感謝します。

4

4 に答える 4

1

そのようなものはあなたのために働きますか?これはかなり基本的なことで、をループして最終的な辞書を作成しますURLlist

API1r = API1['results']
API2r = API2['hits']
API3r = API3['output']

FullResults = {}
for (U, R) in zip(URLlist, Results):
    FullResults[U] = {}
    for api in (API1r, API2r, API3r):
        for v in api:
            k = dict()
            k.update(v)
            if (k.pop('url') == U):
                FullResults[U].update((k.items()+[('score', R)]))

同じものurlが異なるAPIsに存在する可能性がありますが、情報が異なるため、対応するエントリをFullResults事前に作成する必要があるため、ループを単純化するのは少し難しい場合があります。LMKHIW。

于 2012-07-17T13:28:05.937 に答える
1

APIをあなたにとってより意味のあるものに変換します。URLの口述はおそらくより適切です:

def transform_API(API):
    list_of_dict=API.get('results',API.get('hits',API.get('output')))
    if(list_of_dict is None):
       raise KeyError("results, hits or output not in API")
    d={}
    for dct in list_of_dict:
        d[dct['url']]=dct
        dct.pop('url')
    return d

API1=transform_API(API1)
API2=transform_API(API2)
API3=transform_API(API3)

master={}
for d in (API1,API2,API3):
    master.update(d)

urls=list(master.keys())
scores=get_scores_from_urls(urls)

for k,score in zip(urls,scores):
    master[k]['score']=score
于 2012-07-17T13:11:49.527 に答える
1

与えられたデータで…</p>

Full_Results = {d['url']: {'title': d['title'], 'snippet': d['snippet'], 'score': ScoredResults[d['url']]} for d in API1['results']+API2['hits']+API3['output']}

結果として:

{'www.dol.com': {'score': 2.1,
  'snippet': 'This is the dol site',
  'title': 'The DOL site'},
 'www.othersite.com': {'score': 3.5,
  'snippet': 'This is another site',
  'title': 'Another site'},
 'www.site.com': {'score': 1.2,
  'snippet': 'This is a great site',
  'title': 'A great site'},
 'www.whatever.com': {'score': 4.0,
  'snippet': 'This is a site about whatever',
  'title': 'Whatever site'},
 'www.wiki.com': {'score': 6.5,
  'snippet': 'This is a wiki site',
  'title': 'A wiki site'}}
于 2012-07-17T12:54:34.930 に答える
1

簡単な試み:

from itertools import chain

full_result = {}

for blah in chain.from_iterable(d.itervalues() for d in (API1, API2, API3)):
    for d in blah:
        full_result[d['url']] = {
            'title': d['title'],
            'snippet': d['snippet'],
            'score': ScoredResults[d['url']]
        }

print full_result
于 2012-07-17T13:00:27.923 に答える