给定可迭代的集合和名称(字符串),返回一组与给定的" name"相关联的名称。

时间:2014-12-16 04:58:57

标签: python set

给定一个名称(作为字符串)和一组可迭代的集合,包含两个名称(作为字符串),返回一个由共享具有给定名称的集合的名称组成的新集合。

例如:

 itr = ({"a", "b"}, {"b", "c"}, {"c", "a"})
 name = "a"
 newset = {"b", "c"}

我正在寻找一种解决这个问题的pythonic方法。这是我当前的混乱:

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和编程一般都比较新。谢谢

4 个答案:

答案 0 :(得分:4)

>>> set(e for s in itr for e in s if name in s) - set((name,))
set(['c', 'b'])

答案 1 :(得分:2)

>>> reduce(set.union, filter(lambda x: name in x, itr), set()) - set((name,))
set(['c', 'b'])

答案 2 :(得分:2)

你的逻辑很好,但你说的解决方案很麻烦:

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,))

答案 3 :(得分:0)

  1. 首先,使用生成器表达式

    过滤出具有name的集合
    >>> filtered_sets = (item - {name} for item in itr if name in item)
    
  2. 然后,通过迭代生成器,过滤掉name

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