Python 给定一组iterable和一个名称(字符串),返回一组与给定的;名称“;

Python 给定一组iterable和一个名称(字符串),返回一组与给定的;名称“;,python,set,Python,Set,给定一个名称(作为字符串)和一个包含两个名称(作为字符串)的集合的iterable,返回一个新集合,该集合由与给定名称共享一个集合的名称组成 例如: itr = ({"a", "b"}, {"b", "c"}, {"c", "a"}) name = "a" newset = {"b", "c"} 我正在寻找一种类似蟒蛇的方法来解决这个问题。这就是我目前的困境: def friends(itr, name): newset = [] for i in itr:

给定一个名称(作为字符串)和一个包含两个名称(作为字符串)的集合的iterable,返回一个新集合,该集合由与给定名称共享一个集合的名称组成

例如:

 itr = ({"a", "b"}, {"b", "c"}, {"c", "a"})
 name = "a"
 newset = {"b", "c"}
我正在寻找一种类似蟒蛇的方法来解决这个问题。这就是我目前的困境:

def friends(itr, name):
    newset = []
    for i in itr:
        if name in i:
            for j in i:
                if j != name:
                    newset.append(j)
    return set(newset)
任何帮助都将不胜感激。一般来说,我对Python和编程比较陌生。多谢各位

>>> set(e for s in itr for e in s if name in s) - set((name,))
set(['c', 'b'])
  • 首先,使用生成器表达式筛选出具有
    名称的集合

    >>> filtered_sets = (item - {name} for item in itr if name in item)
    
  • 然后,通过迭代生成器,过滤掉
    名称

    >>> {item for items in filtered_sets for item in items if name != item}
    {'b', 'c'}
    
  • 首先,使用生成器表达式筛选出具有
    名称的集合

    >>> filtered_sets = (item - {name} for item in itr if name in item)
    
  • 然后,通过迭代生成器,过滤掉
    名称

    >>> {item for items in filtered_sets for item in items if name != item}
    {'b', 'c'}
    

  • 您的逻辑很好,但解决方案很混乱,正如您所说:

    def friends(itr, name):
        newset = [] # Your should probably make this a set
        for i in itr:
            if name in i:
                for j in i: # This loops is really not necessary 
                    if j != name: 
                        newset.append(j)
        return set(newset)
    
    您的代码可以更改为类似以下内容,而无需任何花哨的工具:

    def friends(itr, name):
        newset = set()
        for subset in itr:
            if name in subset:
                newset.update(subset)
        return newset.difference((name,))
    

    您的逻辑很好,但解决方案很混乱,正如您所说:

    def friends(itr, name):
        newset = [] # Your should probably make this a set
        for i in itr:
            if name in i:
                for j in i: # This loops is really not necessary 
                    if j != name: 
                        newset.append(j)
        return set(newset)
    
    您的代码可以更改为类似以下内容,而无需任何花哨的工具:

    def friends(itr, name):
        newset = set()
        for subset in itr:
            if name in subset:
                newset.update(subset)
        return newset.difference((name,))
    

    那代码似乎工作得很好,有什么问题吗?是的,代码是可以工作的,但是我希望代码能工作得更完美一些,有什么问题吗?是的,代码是有效的,但是我希望有更“pythonic”的东西。我喜欢用有意义的方式命名变量。我喜欢用有意义的方式命名变量。注意,这会给不是单字符字符串的
    name
    s带来麻烦。谢谢@IgnacioVazquez Abrams,已修复。请注意,这将使非1个字符字符串的
    name
    s陷入混乱。感谢@IgnacioVazquez Abrams,已修复。
    set(如果name in x and y!=name,则在itr中y代表y in x)
    使我认为这更简单
    set(如果name in x and y!=name,则在itr中y代表y in x)
    使我认为这更简单