-4

d=辞書

戻ることができるように機能したい{'John':1,'Mark':3}

def build_person_to_matches(d, name): '''(dict of {str: list of str}, str) -> dict of {str: int}'''
    collect = 0
    for books in d[name]:
        for person in d.keys():
            if books in d[person]:
               collect += 1
        d[person] = collect
    return d

ただし、この関数は次の例では機能しません。

build_person_to_matches({'Tom': ['fiction', 'documentary', 'science'],'John': ['computer science', 'math'],'Jack': ['science', 'computer science', 'math', 'chemistry']}, 'Jack')
4

4 に答える 4

1

まず、渡されたディクショナリと返されるディクショナリを分離する必要があります。

def build_person_to_matches(d, name):
    ret = {}
    collect = 0
    for books in d[name]:
        for person in d.keys():
            if books in d[person]:
               collect += 1
        ret[person] = collect
    return ret

d = {
    'Tom': ['fiction', 'documentary', 'science'],
    'John': ['computer science', 'math'],
    'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')

次に、2 つの for ループの順序を入れ替えて、collect = 0行を最初のループに移動します。

def build_person_to_matches(d, name):
    ret = {}
    for person in d.keys():
        collect = 0
        for books in d[name]:
            if books in d[person]:
               collect += 1
        ret[person] = collect
    return ret

d = {
    'Tom': ['fiction', 'documentary', 'science'],
    'John': ['computer science', 'math'],
    'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')

必要に応じて、読みやすくするために、内部ループを独自の関数に移動して、何が起こっているのかをより明確にすることもできます。

def how_many_genres_both_people_like(d, person_a, person_b):
    total = 0
    for books in d[person_a]:
        if books in d[person_b]:
           total += 1
    return total

def build_person_to_matches(d, name):
    ret = {}
    for person in d.keys():
        ret[person] = how_many_genres_both_people_like(d, name, person)
    return ret

d = {
    'Tom': ['fiction', 'documentary', 'science'],
    'John': ['computer science', 'math'],
    'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')

出力:

{'John': 2, 'Jack': 4, 'Tom': 1}
于 2013-03-21T19:40:06.050 に答える
0
for entry in d:
    print(entry + ':' + str(len(d[entry])))

(関数に入れる場合は、print を return に置き換えます)

これは、辞書「d」の各エントリを実行し、対応するエントリの長さを見つけます。辞書の項目をあなたが持っているリスト形式に保つようにしてください。そうすればうまくいくはずです!

于 2013-03-21T19:26:32.927 に答える
0

for books in d[name]:各ループの開始時に収集値をリセットしたい場合があります

于 2013-03-21T19:36:07.163 に答える
0

辞書内包表記といくつかの集合演算の使用:

def build_person_to_matches(d, name):
    return {n:len(set(d[n]) & set(d[name])) for n in d}

または、名前パラメーターを一致に表示したくない場合

def build_person_to_matches(d, name):
    return {n:len(set(d[n]) & set(d[name])) for n in d if n != name}

セットの交差に「&」を使用したくない場合は、より説明的にすることができます

def build_person_to_matches(d, name):
    return {n:len(set(d[n]).intersection(d[name])) for n in d if n != name}
于 2013-03-21T20:06:45.373 に答える