-1

if ステートメントの条件であるステートメントの評価順序を理解するのに苦労しています。

単語をWebページのリストにマップする、次のような辞書があるとします。

index = { WORD, [url1,url2,url3] }

このインデックスに挿入する場合、次の 2 つのケースがあります。

1) キー (WORD) はインデックスにまだ存在しません。リストを作成し、WORD を
マップのキーとして設定する必要があります。

2)キー(WORD)はすでにインデックスに存在します。辞書に既にあるリストに現在のURLを追加するだけです

私が期待したこと:

def update_index(word, url):
    if word in index and not(url in index[word]):
       index[word].append(url) # list already exists append to it
    else: 
       index[word] = [url] # new list with url as a single element

ただし、これは単語ごとに 1 つの URL しか許可しません。

何がうまくいったか:

def update_index(word, url):
    if word in index:                  # <- isnt having two consecutive if statements 
                                       # the same as an AND???
       if not(url in index[word]):
          index[word].append(url) # list already exists append to it
    else: 
       index[word] = [url] # new list with url as a single element

これを解決するための助けをいただければ幸いです。

4

3 に答える 3

3

それらは間違いなく異なります(else句があるため)。最初のケースではelse、辞書にキーがあり、要素がすでにリストにある場合に節を入力します (これはおそらく望ましくありません)。

つまり、が既にリストにある場合は、何もしないのではなくurl、リストを に置き換えます。[url]

于 2012-09-12T19:38:30.020 に答える
2

論理の問題を理解するには、他の回答を見てください。しかし、コメントで述べたように、次の方法で問題全体を終了できます。

from collections import defaultdict

url_store = defaultdict(set)
url_store[word].add(url)
于 2012-09-12T19:43:27.097 に答える
1

問題は、既にリストにある URL を見つけるたびに、常に URL のリスト全体を上書きすることです。

条件は、単語がインデックスあるかどうか、およびその単語のリストに URL がまだないかどうかを確認します。したがって、単語がインデックスにあり、URL が既にリストにある場合、条件全体が false と評価され、else-case が実行され、その単語の既存のリストが重複する URL のみを保持するリストで上書きされます。

代わりに、これを試してください:

if word not in index:
    index[word] = [] # create new empty list for word
# now we know that a list exists -> append
if url not in index[word]:
    index[word].append(url)

を使用するdefaultdictと、別の回答で示唆されているように、defaultdictがこのチェック (最初のifステートメント) を行います。

更新:複合 if 条件を自分で間違えました... 最初の段落が修正されました。

于 2012-09-12T19:39:42.960 に答える