为什么我得到一个None值,为什么这个数字仍然用Python打印?

时间:2012-11-08 03:13:13

标签: python list dictionary set

  

可能重复:
  Function printing correct Output and None

尝试在假装的Twitter Feed程序中打印共享用户。家庭作业。数字是用户(ex 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)

请帮我理解这个问题!

2 个答案:

答案 0 :(得分:1)

findmutual不返回任何内容,在Python中等同于返回None。所以“无”出现在输出中,因为你告诉它打印findmutual(item, all_users)的返回值,它总是None

由于findmutual 本身打印它们,因此仍在打印数字。这很少是你想要的,因为它拒绝你调用findmutual来查找用户id并对它们做任何其他事情的灵活性;每次调用它都会打印它们(即使你不想要它),并且你无法访问Python中的数字以进一步操作。

答案 1 :(得分:0)

for item in users:
    print item, ":\t", findmutual(item, all_users) # << That's why it shows None

这里发生了什么?

  1. item = users [n]
  2. 打印:
    1. 项目
    2. 输入功能
    3. 该功能打印更多
    4. 功能结束并且(自动)返回无
    5. 打印函数的返回值(无)!
  3. 您可能想要更改步骤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)]