2
index = {'Michael': [['mj.com',1], ['Nine.com',9],['i.com', 34]], / 
         'Jackson': [['One.com',4],['mj.com', 2],['Nine.com', 10], ['i.com', 45]], /
         'Thriller' : [['Seven.com', 7], ['Ten.com',10], ['One.com', 5], ['mj.com',3]}

# In this dictionary (index), for eg: 'KEYWORD': 
# [['THE LINK in which KEYWORD is present,'POSITION
# of KEYWORD in the page specified by link']]

例:Michaelは、MJ.com、NINE.com、およびi.comのそれぞれのページの位置1、9、34に存在します。

入力として受け取るPythonプロシージャindexを手伝ってください。KEYWORDS

私が入るとき'MICHAEL'。結果は次のようになります。

>>['mj.com', 'nine.com', 'i.com']

入力すると'MICHAEL JACKSON'.、結果は次のようになります。

>>['mj.com', 'Nine.com']

'Michael'と'は、それぞれ(1,2)と(9,10)の位置に連続Jackson'して存在します。両方のキーワードが含まれていても結果は表示されませんが、連続して配置されていません。'mj.com''nine.com''i.com'

入力すると'MICHAEL JACKSON THRILLER',、結果は次のようになります。

['mj.com']

3つの単語がそれぞれ(1、2、3)の位置'MICHAEL', 'JACKSON', 'THRILLER'に連続して配置されているためです。'mj.com'

入力する'THRILLER JACKSON''THRILLER FEDERER',、結果が。になるはずですNONE

4

3 に答える 3

0

補足として、Udacity Intro to CS では、まさにこの質問について説明しています。これにより、適切な入力について多くの仮定が立てられます (基本的に、誤った入力に遭遇することはありません)。

def lookup(index,KEYWORDS):
    kw = KEYWORDS.split()
    if len(kw) == 1:
        return [site[0] for site in index[kw[0]]]
    else:
        positions = {}
        result = []
        kw = KEYWORDS.split()
        for kword in kw:
            for site in index[kword]:
                positions[(kword,site[0])]=site[1]
        for i in range(0,len(kw)-1):
            cur_urls = [site[0] for site in index[kw[i]]]
            next_urls = [site[0] for site in index[kw[i+1]]]
            if i == 0:
                result = cur_urls
            for url in cur_urls:
                if url in next_urls:
                    if not (positions[kw[i+1],url]-positions[kw[i],url]) == 1:
                        result.remove(url)
                else:
                    if url in result:
                        result.remove(url)
        return result
于 2012-09-24T21:31:12.107 に答える
0

セットと交差を使用する:

def func(key,dic):
    keys=key.split()
    values=[set(y if i==0 else y if dic[x][y]-dic[keys[i-1]].get(y,-10000)==1 \
                else None for y in dic[x]) for i,x in enumerate(keys)]
    sett=values[0]
    for y in values[1:]:
        sett &= y
    print(sett)

index = {'Michael': {'mj.com':1,'Nine.com':9,'i.com':34},
         'Jackson':{'One.com':4,'mj.com':2,'Nine.com':10,'i.com':45},
         'Thriller' : {'Seven.com':7,'Ten.com':10,'One.com':5,'mj.com':3}}

出力:

>>> func("Michael",index)
{'Nine.com', 'mj.com', 'i.com'}
>>> func("Michael Jackson",index)
{'Nine.com', 'mj.com'}
>>> func("Michael Jackson Thriller",index)
{'mj.com'}
于 2012-09-24T20:38:26.353 に答える
0

まず、検索では大文字と小文字が区別されないように見えるため、インデックスを大文字 (または小文字) にする必要があります。

index = dict((key.upper(), val) for (key, val) in index.iteritems())

ここに再帰的なアプローチがあります。まず、インターフェース関数:

def search(query):
    return [site for (site, pos) in search2(query.split())]

次の関数が実際の作業を行います。単語が 1 つだけ指定されている場合は、この単語のインデックス内のエントリを返します。それ以外の場合は、位置が一致するインデックスをフィルター処理します。

def search2(words):
    if len(words) == 1:
        return index[words[0]]
    else:
        return [(site1, pos1) for (site1, pos1) in index[words[0]]
                              for (site2, pos2) in search2(words[1:])
                              if (site1 == site2 and pos1 == pos2-1)]

もちろん、pos実際に各サイトのポジションのリストになると、事態はもう少し複雑になります...

于 2012-09-24T21:35:24.310 に答える