通过字典迭代并返回共享x个值的键和值? x是用户输入?

时间:2017-09-22 02:14:36

标签: python csv dictionary cluster-analysis

  

给定名为hobbies.txt的文件。

     

此文件包含一组Facebook用户及其爱好。

     

文件中的每一行都包含用户/用户名和爱好列表   那个用户每行中的数据以逗号分隔。

     

例如,在行中2254,reading,coding,swimming,playing soccer,

     

用户/用户名是:2254

     

兴趣爱好是:阅读,编码,游泳和踢足球

     

爱好的数量和类型可能因用户而异。

     

此文件将是您的代码必须阅读才能使用的数据集   实现执行以下操作的代码:

     

寻找朋友的圈子/网络:

     

在您要报告的每个圈子中,所有用户应至少共享x   爱好数量

     

x是用户可以输入到程序的变量。

     

应将朋友圈写入名为circles.txt的文件。

     

每一行都应该包含您找到的圈子/网络中的用户名,   标签字符和共享爱好列表。

     

例如,一行可能如下所示:   2254,552,1258 reading,swimming,hiking

     

寻找热门用户:

     

受欢迎程度是基于至少y圈/网络的一部分。

     

y可以是用户可以输入到程序的变量。

     

应将热门用户写入名为popular.txt的文件。每   用户以及用户所属的圈数/网络数量应该在   单独的行并由制表符分隔。

     

例如:2254 5

     

此步骤应在步骤(a。)之后进行。

     

提示:您可能希望将部分(a。)中找到的圆圈保存在某些圆圈中   数据结构,以便您可以在这部分中使用它们。

我的代码:python

import csv
csv_file = open ('hobbies.txt')
csv_reader = csv.reader(csv_file, delimiter=',')
csv_dict={}
for row in csv_reader:
  k= row[0]
  v = row[1:]
  csv_dict[k] = [x.strip() for x in v]

for i in csv_dict.values():
  i.pop()

keyList =[*csv_dict]
circle ={}  
for i in range(len(keyList)):
   i_item = keyList[i]
   for j in range(i+1, len(keyList)):
      j_item = keyList[j]
      user1 = set(csv_dict[i_item])
      user2 = set(csv_dict[j_item])
      hob = user1.intersection(user2)
      if (len(hob) > 1):
      hob = tuple(hob)
      circle[hob] = [i_item, j_item]    
print(circle)
output: 
{('cosplay', 'textiles'): ['2345', '4545'], ('orienteering', 'running'): 
['4567', '5050'], ('orienteering', 'jumping', 'running'): ['8888', '5050'], 
('dancing', 'singing'): ['9999', '1010'], ('cake', 'racing', 'decorating', 
'car'): ['4545', '5050']}

现在我的代码只是在两个用户之间进行比较,我如何比较分享x爱好的3,4,5,......,n?

1 个答案:

答案 0 :(得分:0)

您可以为共享它们的一组用户制作爱好词典。

hobby_users。使用此功能可以为共享它们的用户数量制作业余爱好词典(hobby_user_count)。

user_hobbies = defaultdict(set)
all_hobbies = set()

for row in csv_reader:
    user, hobbies = row[0], [h.strip() for h in row[1:]]
    user_hobbies[user].update(hobbies)
    all_hobbies.update(hobbies) # build set of hobbies to be used later

hobby_users = {
    h: set(u for u, hs in user_hobbies.items() if h in hs) for h in all_hobbies
}

hobby_user_count = {
    h: len(us) for h, us in hobby_users.items()
} # if you have hobby_users or

hobby_user_count = {
    h: sum(1 for hs in user_hobbies.values() if h in hs) for h in all_hobbies
} # just using all hobbies

您可以在hobby_user_count查找用户输入。

shared_hobbies_matching_count = [
    h for h, user_count in hobby_user_count.items() if user_count is user_input
]