1

私はこの問題に取り組んできましたが、非常に長い時間のようです。次のような辞書があります。

{'1': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,'The Night Listener': 3.0}, '2': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,'You, Me and Dupree': 3.5},'3': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,'Superman Returns': 3.5, 'The Night Listener': 4.0}}

実際にはもっと大きな問題ですが、私が見つけようとしているのは、少なくとも 2 つの映画が互いに共通している ID のペアのリストまたはセットです。しかし、何かが間違っているに違いありません。なぜなら、最初のキーは 2 番目のキーとチェックし、次に最初のキーと 3 番目のキーをチェックしなければならないからです。次に、3番目のキーの番です。

最後に、少なくとも 2 つの映画に共通するキーのみを取得したいと考えています。

私はこれをやってみました:

def sim_critics(movies):
    similarRaters=set()

    first=1
    lastCritic= ''

    movie_over = collections.defaultdict(list)
    movCount=Counter(movie  for v in movies.values() for movie in v)

    for num in movies:
        for movie, _ in movies[num].items():
            movie_over[movie].append(num)


    for critic,_ in movie_over.items():
        if first!=1:
            critic_List = collections.Counter(movie_over[critic])
            critic2_list = collections.Counter(movie_over[lastCritic])
            overlap = list((critic_List & critic2_list).elements())

            if len(overlap) >= 2:
                key = critic + " and " + lastCritic 
                similarRaters.add(key)  
        lastCritic= critic
        first=2  
    return similarRaters
4

1 に答える 1

1

簡単な解決策はこれを行うことです:

def simCritics(movies):
    matchingDicts = set()
    for m in movies:
        for i in movies:
            if (len(m) + len(i)) > len(set(m).union(i)):
                matchingDicts.add((m, i))

    myList = [i for i in list(matchingDicts) if i[0] != i[1]]

    myL = []
    for i in myList:
        if (i[1], i[0]) in myL:
            continue
        myL.append(i) 
    return myL

中間の比較 (len を比較するもの) は非常に重要です。なぜなら、ムービーが重複する場合、少なくとも 1 つの同一のキーが存在するため、ユニオン (重複を削除する) は合計よりも小さくなるからです。

于 2013-05-03T22:54:33.283 に答える