将项目添加到列表中的集合时,我得到了意外的结果,这样我可以通过索引列表来指定我需要的集合,如以下代码所示:
def get_friends_of_users(network):
f1 = lambda x: x[0]
f2 = lambda x: x[1]
users_friends = [set()] * max(max(network, key=f1)[0], max(network, key=f2)[1]+1)
net_users = set()
for i in network:
users_friends[i[0]].add(i[1])
users_friends[i[1]].add(i[0])
net_users.add(i[0])
net_users.add(i[1])
#print(users_friends)
return net_users, users_friends
让可变网络成为以下元组列表:
network = [(3, 5), (2, 1), (2, 4), (1, 5), (5, 0), (3, 2), (3, 0)]
将用户及其朋友描述为(user_ID,friend_ID)。
我希望变量users_friends
是每个用户的所有朋友的集合的列表,如下所示:
用户ID = 0的ID为3、5的朋友
用户ID = 1的ID为2、5的朋友
用户ID = 2的朋友的ID为1、3、4
用户ID = 3的朋友的ID为0、2、5
用户ID = 4的朋友的ID = 2
用户ID = 5的朋友的ID为0、1、3。
但是当我取消注释代码中的print语句时,我可以看到,每次执行语句users_friends[i[0]].add(i[1])
或users_friends[i[1]].add(i[0])
时,它都会将该项目添加到列表中的所有集合中。
所以,这是输出:
[{3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}, {3, 5}]
[{1, 2, 3, 5}, {1, 2, 3, 5}, {1, 2, 3, 5}, {1, 2, 3, 5}, {1, 2, 3, 5}, {1, 2, 3, 5}]
[{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]
[{1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5}]
[{0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}]
[{0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}]
[{0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}, {0, 1, 2, 3, 4, 5}]
我的问题是:为什么将项目添加到列表中的所有集合中,以及如何通过索引这些集合的列表将其添加到我指定的集合中?