1

重複の可能性:
関数の印刷は正しい 出力となし

偽の Twitter フィード プログラムで相互ユーザーを印刷しようとしています。宿題。数字はユーザーです(例1111はユーザーです)。次のディクショナリ セットは、キーのフレンドのセットです。

この出力が欲しい:

Most friends in common
1111:   222 33333 5454
222:    1111 33333 5454
33333:  1111 222
5454:   1111 222

ただし、代わりに次の出力があります。

Most friends in common
1111 :  222 33333 5454  1111 None
222 :   1111 33333 5454  222 None
33333 :  1111 222  33333 None
5454 :   1111 222  5454 None

これが私のプログラムです:

all_users = {'1111': set(['5454', '222']), '33333': set(['5454']), '5454': set(['1111', '33333', '222']), '222': set(['1111', '5454'])}



def findmutual(id, all_users):
    users = []
    for key in all_users:
        mutual = all_users[id].intersection(all_users[key])
        rank = len(mutual)
        templist = [rank, key.strip()]
        users.append(templist)
    users = sorted(users)

    print users

    for item in users:
        if  id == item[1]:
            print "" ,
        if item[0] == 0:
            print "",
        else:
            print item[1],


users = []
for key in all_users:
    users.append(key)
users = sorted(users)
print "Most friends in common"
for item in users:
    print item, ":\t", findmutual(item, all_users)

この問題を理解するのを手伝ってください!

4

2 に答える 2

1

findmutualは何も返しません。これは、Python では を返すことと同じNoneです。findmutual(item, all_users)したがって、常に であるの戻り値を出力するように指示しているため、「なし」が出力に表示されますNone

findmutual 番号自体が印刷されるため、番号はまだ印刷されています。これが必要になることはほとんどfindmutualありません。ユーザー ID を見つけてそれ以外のことを行うための呼び出しの柔軟性が失われるからです。あなたがそれを呼び出すたびに、それは(あなたがそれを望まなくても)それらを印刷し、さらに操作するためにPythonの数字にアクセスすることはできません.

于 2012-11-08T03:24:24.987 に答える
0
for item in users:
    print item, ":\t", findmutual(item, all_users) # << That's why it shows None

ここで何が起きてるの?

  1. 項目 = ユーザー[n]
  2. 印刷:
    1. アイテム
    2. 関数を入力します
    3. 関数はさらに出力します
    4. 関数が終了し、(自動的に) None を返します
    5. 関数の戻り値 (None) を出力してください!

おそらくステップ 3 ~ 4 を変更する必要があります。次のようなすべての印刷ステートメントの代わりに:

result=''
...
result += '' #whatever
...
return result

アップデート:

私が正しければ、誰が最も人気があるかに応じてランクを確立しようとしていますか?

その場合、その解決策を調べることができます:

all_users = {'1111': set(['5454', '222']),
             '33333': set(['5454']),
             '5454': set(['1111', '33333', '222']),
             '222': set(['1111', '5454'])}

from collections import defaultdict, Counter

def findmutual(user_relation_map):    
    user_list = set(sorted(user_relation_map.keys()))
    user_ranking = defaultdict(int)
    for user in user_list:
        for friend in user_relation_map[user]:
            user_ranking[friend] += 1
    return user_ranking

c=Counter(findmutual(all_users))
print("Ranking : {0}".format(c.most_common()))

>>> Ranking : [('5454', 3), ('1111', 2), ('222', 2), ('33333', 1)]
于 2012-11-08T03:26:49.540 に答える