返回类似人员名单

时间:2017-04-16 13:05:47

标签: python list dictionary for-loop

我有一本包含类似人员名单的字典。因此,根据上述声明,我希望David和charles作为一个类似人员列表返回,基于共同兴趣(在这种情况下是数据挖掘)和Ramesh和Suresh作为第二个类似人员列表(遗传学常见于都)。如何做到这一点(没有功能的结果很好)?

dataset={
'David':['Artificial Intelligence','Machine learning', 'Neural networks', 'data mining'],
'Charles':['embedded computing','data mining','digital filters','signal processing','virtual reality','augmented reality'],
'Ramesh':['molecular biology','genetics','neuro surgery','oncology','ophthalmology'],
'Suresh':['genetics','neurology','ENT','bioinformatics','gene processing','radiology','pharmacology']
}

def commoninterest(personi,personj):
    similar_persons=[]

for interest in dataset[personi]:
    if interest in dataset[personj]:
        similar_persons.append(personi,personj)
return similar_persons

2 个答案:

答案 0 :(得分:0)

问题尚未准确定义。这个例子表明,一个共同的属性足以使两个人相似。在这种情况下,您应该创建尽可能多的人员列表。 (也许,你可以删除空列表。)

我想制定一个更复杂的措施,你应该根据共同兴趣的数量来定义人与人之间的指标。在这种情况下,我建议使用集合而不是列表,因为

  • 它保证元素保持唯一,
  • 属性的顺序无关紧要(正如我在示例中看到的那样),
  • 您可以使用交叉集操作来计算公共属性,
  • 它使您的代码更快。

答案 1 :(得分:0)

就像Imre Piller所说,你想在列表中存储兴趣。这是一种可能的溶剂。此外,该功能会告诉您这些配对的共同兴趣,但如果您愿意,可以摆脱它。

dataset={
'David':set(['Artificial Intelligence','Machine learning', 'Neural networks', 'data mining']),
'Charles':set(['embedded computing','data mining','digital filters','signal processing','virtual reality','augmented reality']),
'Ramesh':set(['molecular biology','genetics','neuro surgery','oncology','ophthalmology']),
'Suresh':set(['genetics','neurology','ENT','bioinformatics','gene processing','radiology','pharmacology'])
}

def get_common_intrests(people):
    pairs = []
    p_list = list(people)
    for i, p1 in enumerate(p_list):
        for p2 in p_list[:i]:
            common_interests = people[p1].intersection(people[p2])
            if len(common_interests) > 0:
                pairs.append([p1, p2, common_interests])
    return pairs

print get_common_intrests(dataset)

结果(python 2):

[['Suresh', 'Ramesh', set(['genetics'])], ['David', 'Charles', set(['data mining'])]]