首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中创建认识其他朋友的朋友字典

在python中创建认识其他朋友的朋友字典
EN

Stack Overflow用户
提问于 2013-03-11 13:39:11
回答 3查看 5.6K关注 0票数 2

在任何一群人中,都有许多对朋友。假设有两个人共享一个朋友,他们自己也是朋友。(是的,这在现实生活中是一个不切实际的假设,但不管怎样,让我们这样做)。换句话说,如果A和B是朋友,B和C是朋友,那么A和C也一定是朋友。使用这个规则,我们可以将任何一组人划分为朋友圈,只要我们对组中的友谊有所了解。

编写一个带有两个参数的函数network()。第一个参数是组中的人数,第二个参数是定义好友的元组对象列表。假设人们是由数字0到n-1标识的。例如,tuple (0,2)表示person 0与person 2是好友。该函数应打印出好友圈子中的人的划分。下面显示了该函数的几个示例运行:

代码语言:javascript
运行
复制
>>>networks(5,[(0,1),(1,2),(3,4)])#execute

社交网络0为{0,1,2}

社交网络1为{3,4}

老实说,我对如何开始这个程序相当迷茫,任何提示都将非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-21 23:53:06

代码语言:javascript
运行
复制
def networks(n,lst):
groups= []
for i in range(n)
    groups.append({i})
for pair in lst:
    union = groups[pair[0]]|groups[pair[1]]
    for p in union:
        groups[p]=union
sets= set()
for g in groups:
    sets.add(tuple(g))
i=0
for s in sets:
    print("network",i,"is",set(s))
    i+=1

如果有人关心的话这就是我要找的。

票数 0
EN

Stack Overflow用户

发布于 2013-03-11 14:44:31

可以用来解决这个问题的一种有效的数据结构是disjoint set,也称为union-find结构。不久前,我为another answer写了一个。

结构是这样的:

代码语言:javascript
运行
复制
class UnionFind:
    def __init__(self):
        self.rank = {}
        self.parent = {}

    def find(self, element):
        if element not in self.parent: # leader elements are not in `parent` dict
            return element
        leader = self.find(self.parent[element]) # search recursively
        self.parent[element] = leader # compress path by saving leader as parent
        return leader

    def union(self, leader1, leader2):
        rank1 = self.rank.get(leader1,1)
        rank2 = self.rank.get(leader2,1)

        if rank1 > rank2: # union by rank
            self.parent[leader2] = leader1
        elif rank2 > rank1:
            self.parent[leader1] = leader2
        else: # ranks are equal
            self.parent[leader2] = leader1 # favor leader1 arbitrarily
            self.rank[leader1] = rank1+1 # increment rank

下面是你如何使用它来解决你的问题:

代码语言:javascript
运行
复制
def networks(num_people, friends):
    # first process the "friends" list to build disjoint sets
    network = UnionFind()
    for a, b in friends:
        network.union(network.find(a), network.find(b))

    # now assemble the groups (indexed by an arbitrarily chosen leader)
    groups = defaultdict(list)
    for person in range(num_people):
        groups[network.find(person)].append(person)

    # now print out the groups (you can call `set` on `g` if you want brackets)
    for i, g in enumerate(groups.values()):
        print("Social network {} is {}".format(i, g))
票数 1
EN

Stack Overflow用户

发布于 2013-03-12 12:36:48

这是一个基于connected components in a graph (由@Blckknght推荐)的解决方案:

代码语言:javascript
运行
复制
def make_friends_graph(people, friends):
    # graph of friends (adjacency lists representation)
    G = {person: [] for person in people} # person -> direct friends list
    for a, b in friends:
        G[a].append(b) # a is friends with b
        G[b].append(a) # b is friends with a
    return G

def networks(num_people, friends):
    direct_friends = make_friends_graph(range(num_people), friends)
    seen = set() # already seen people

    # person's friendship circle is a person themselves 
    # plus friendship circles of all their direct friends
    # minus already seen people
    def friendship_circle(person): # connected component
        seen.add(person)
        yield person

        for friend in direct_friends[person]:
            if friend not in seen:
                yield from friendship_circle(friend)
                # on Python <3.3
                # for indirect_friend in friendship_circle(friend):
                #     yield indirect_friend

    # group people into friendship circles
    circles = (friendship_circle(person) for person in range(num_people)
               if person not in seen)

    # print friendship circles
    for i, circle in enumerate(circles):
        print("Social network %d is {%s}" % (i, ",".join(map(str, circle))))

示例:

代码语言:javascript
运行
复制
networks(5, [(0,1),(1,2),(3,4)])
# -> Social network 0 is {0,1,2}
# -> Social network 1 is {3,4}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15331877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档