给定一个名称(作为字符串)和一组可迭代的集合,包含两个名称(作为字符串),返回一个由共享具有给定名称的集合的名称组成的新集合。
例如:
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和编程一般都比较新。谢谢
答案 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)
首先,使用生成器表达式
过滤出具有name
的集合
>>> filtered_sets = (item - {name} for item in itr if name in item)
然后,通过迭代生成器,过滤掉name
>>> {item for items in filtered_sets for item in items if name != item}
{'b', 'c'}