(str,int)元组词典的python列表

时间:2014-03-31 05:00:13

标签: python dictionary tuples

我正在尝试返回(str, int)元组的列表,这是元组列表中给定人员的朋友推荐,其中每个元组的第一个元素是潜在朋友的名字(在与字典键相同的格式),第二个元素是潜在朋友的分数。只有具有非零分数的潜在朋友才能被列入名单。

以下是此函数返回值格式的示例:

[('Gloria Pritchett', 2),
 ('Manny Delgado', 1),
 ('Cameron Tucker', 1),
 ('Luke Dunphy', 3)]

对于每个人,社交网络中他们目前不是朋友的所有人都是潜在的朋友。对于特定的人,每个潜在的朋友使用以下积分系统进行评分: 对于此人和潜在朋友所拥有的每个共同朋友,将1点添加到潜在朋友的分数中 对于此人和潜在朋友都属于的每个网络,将1点添加到潜在朋友的分数中 如果此人的姓氏与潜在朋友的姓氏相同,请将潜在朋友的分数加1分,但前提是他们有其他共同点(共同的朋友,共同的网络或两者) 。 这就是我所做的:

这些是我的两个功能正常: 第一个函数返回键的字典:名称值:朋友'名 第二个函数返回键的字典:名称值:网络

我收到了def make_recommendations的错误消息。我不知道有什么问题..请帮帮我。

2 个答案:

答案 0 :(得分:1)

我不确定这是否正在按照你的想法行事:

for key in person_to_friends or person_to_networks:

通过尝试,你可以看到它真正做的事情:

for x in [1,2,3] or [4,5,6]:
    print x

这实际上是在说:

for value in (first list if it's not empty otherwise second list)

如果要使用两个列表中的值,则应使用itertools.chain

import itertools
for x in itertools.chain([1,2,3], [4,5,6]):
    print x

您在以下情况下犯了类似错误:

if freind in person_to_friends[profiles_file] or person_to_networks[profiles_file]:

请注意freind 中的拼写错误。这可能是您的错误。此函数中的profiles_file未定义,是否在全局范围内?)你可能意味着:

if friend in person_to_friends[profiles_file] or friend in person_to_networks[profiles_file]:

这由Python评估为:

if (value in first sequence) OR (second sequence is not empty)

另外值得注意的是,在person_to_friends中,你有:

name.update({lst[0]:lst[1:]})

虽然这在技术上是正确的,但它比传统的更多开销(在理解和处理方面):

name[lst[0]] = lst[1:]

答案 1 :(得分:0)

我发现问题有点复杂并且包含许多交叉点,我建议您简化解决方案并将其划分为步骤:

例如:

  1. 找到人的朋友score的功能(返回元组列表):

    def friendsMu(person):
        result = []
        friends = person_to_friends[person]
        for key in person_to_friends:
            if key != person:
                friends2 = person_to_friends[key]
                intersect = list(set(friends) & set(friends2))
                p = len(intersect)
                if p != 0:
                    t = (key, p)
                    result.append(t)
        return result
    
  2. 查找人员网络score的功能(返回元组列表):

    def networkMu(person):
        result = []
        friends = person_to_networks[person]
        for key in person_to_networks:
            if key != person:
                friends2 = person_to_networks[key]
                intersect = list(set(friends) & set(friends2))
                p = len(intersect)
                if p != 0:
                    t = (key, p)
                    result.append(t)
        return result
    
  3. 用于计算all persons之前函数的结果的函数(返回字典:key = namevalue = list of tuples):

    def allf();
        ddict = {}
        for key in person_to_friends:
            d1 = friendsMu(key)
            if d1 != ():
                ddict[key] = d1
        return ddict
    
    def alln():
        ndict = {}
        for key in person_to_networks:
            d1 = networkMu(key)
            if d1 != ():
                ndict[key] = d1
        return ndict
    
  4. merge最终结果的作用:

    from collections import Counter
    def mrg(ddict, ndict):
        merged = Counter(ddict)
        merged.update(ndict)
        return merged
    
  5. 输出如下:

     print allf()
     allf() =  {'Jay Pritchett': [('Manny Delgado', 1), ('Cameron Tucker', 1), ('Gloria Pritchett', 1), ('Luke Dunphy', 1)], 'Claire Dunphy': [('Gloria Pritchett', 1), ('Luke Dunphy', 1)], 'Manny Delgado': [('Jay Pritchett', 1), ('Mitchell Pritchett', 1), ('Alex Dunphy', 1), ('Cameron Tucker', 1)], 'Mitchell Pritchett': [('Manny Delgado', 1), ('Phil Dunphy', 1), ('Alex Dunphy', 1)], 'Alex Dunphy': [('Manny Delgado', 1), ('Mitchell Pritchett', 1)], 'Cameron Tucker': [('Jay Pritchett', 1), ('Manny Delgado', 1), ('Luke Dunphy', 1)], 'Haley Gwendolyn Dunphy': [], 'Phil Dunphy': [('Mitchell Pritchett', 1)], 'Dylan D-Money': [], 'Gloria Pritchett': [('Jay Pritchett', 1), ('Claire Dunphy', 1), ('Luke Dunphy', 1)], 'Luke Dunphy': [('Jay Pritchett', 1), ('Claire Dunphy', 1), ('Cameron Tucker', 1), ('Gloria Pritchett', 1)]}
    
     print alln()
     alln() =  {'Phil Dunphy': [], 'Claire Dunphy': [('Gloria Pritchett', 1)], 'Manny Delgado': [('Alex Dunphy', 1)], 'Mitchell Pritchett': [], 'Alex Dunphy': [('Manny Delgado', 1)], 'Cameron Tucker': [], 'Gloria Pritchett': [('Claire Dunphy', 1)]}
    
    merged = mrg(allf(),alln())
    for i in merged:                                                                 
        print i, merged[i]
    merged = 
    Jay Pritchett [('Manny Delgado', 1), ('Cameron Tucker', 1), ('Gloria Pritchett', 1), ('Luke Dunphy', 1)]
    Claire Dunphy [('Gloria Pritchett', 1), ('Luke Dunphy', 1), ('Gloria Pritchett', 1)]
    Manny Delgado [('Jay Pritchett', 1), ('Mitchell Pritchett', 1), ('Alex Dunphy', 1), ('Cameron Tucker', 1), ('Alex Dunphy', 1)]
    Mitchell Pritchett [('Manny Delgado', 1), ('Phil Dunphy', 1), ('Alex Dunphy', 1)]
    Alex Dunphy [('Manny Delgado', 1), ('Mitchell Pritchett', 1), ('Manny Delgado', 1)]
    Cameron Tucker [('Jay Pritchett', 1), ('Manny Delgado', 1), ('Luke Dunphy', 1)]
    Haley Gwendolyn Dunphy []
    Phil Dunphy [('Mitchell Pritchett', 1)]
    Dylan D-Money []
    Gloria Pritchett [('Jay Pritchett', 1), ('Claire Dunphy', 1), ('Luke Dunphy', 1), ('Claire Dunphy', 1)]
    Luke Dunphy [('Jay Pritchett', 1), ('Claire Dunphy', 1), ('Cameron Tucker', 1), ('Gloria Pritchett', 1)]
    

    希望这有助于,如果不能准确地告诉你你要求的东西,那就是引导你的东西。 祝你好运。