从两组dict中的另一组中删除给定元素

时间:2010-07-30 03:55:15

标签: python dictionary set

我有一个字典{ "foo": set(["a", "b"]), "bar": set(["c", "d"]) },我给了两个集合中的一个元素和其他集合的名称。我需要删除该元素。我该怎么做呢?到目前为止,我最好的尝试是:

keys = dict.keys()
if Element in dict[keys[0]].union(dict[keys[1]]):
  dict[keys[abs(keys.index(Other_Set) - 1)]].remove(Element)
但是,这似乎有点过分;有什么方法可以改进吗?

7 个答案:

答案 0 :(得分:3)

试试这个:

dictionary['foo' if otherset == 'bar' else 'bar'].discard(element)

答案 1 :(得分:2)

使用字典查找另一组:

>>> other={'foo':'bar','bar':'foo'}
>>> d = { "foo": set(["a", "b"]), "bar": set(["b", "c"]) }
>>> element = "b"
>>> setname = "bar"
>>> d[other[setname]].discard(element)
>>> d
{'foo': set(['a']), 'bar': set(['c', 'b'])}

答案 2 :(得分:1)

怎么样:

keys = dict.keys()
dict[keys[1 - keys.index(Other_Set)]].discard(Element)

使用discard,如果元素不在集合中,则不会获得KeyError。因此,您不需要检查(另一种方法是忽略KeyError)。并且1 -无需abs

答案 3 :(得分:1)

如果您事先不知道dct中的密钥名称,那么这个可能适合您:

dct={ "foo": set(["a", "b"]), "bar": set(["c", "d"]) }

element='b'
other_set='bar'

for key,value in dct.iteritems():
    if key != other_set:
        value.discard(element)

print(dct)
# {'foo': set(['a']), 'bar': set(['c', 'd'])}

答案 4 :(得分:0)

element = "b"
other = "bar"
d = { "foo": set(["a", "b"]), "bar": set(["b", "c"]) }
theSet = d[[s for s in d.iterkeys() if s != other][0]]
theSet.discard(element)

答案 5 :(得分:0)

我的变体,对任意数量的集合都是通用的,取出所有其他集合的给定项目:

dict_of_sets={'foo':set(['a','b','c']),'bar': set(['d','b','e']),'onemore': set(['a','e','b'])}
givenset,givenitem='bar','b'
otherset= (key for key in dict_of_sets if key != givenset)
for setname in otherset:
  dict_of_sets[setname].discard(givenitem)

print dict_of_sets

"""Output:
{'foo': set(['c', 'a']), 'bar': set(['e', 'b', 'd']), 'onemore': set(['e', 'a'])}
"""

答案 6 :(得分:-1)

这是一种更加“pythonic”的方式:

>>> d = { "foo": set(["a", "b"]), "bar": set(["b", "c"]) }

>>> d['foo']-=d['bar']
>>> d
{'foo': set(['a']), 'bar': set(['c', 'b'])}

当然,d['foo']可能是d[hashable_key],其中hashable_key具有用户输入或您拥有的内容。

集合上的

Recall that the operators - & ^ |会重载到相应的变异方法:

a_set.difference_update(other_set) # also "-"
a_set.intersection_update(other_set) # also "&"
a_set.symmetric_difference_update(other_set) # also "^"
a_set.update(other_set) # also "-"

然后,您可以使用扩充作业-=来修改“foo”的设定值。这里提供的所有其他解决方案似乎对我来说太过于罗嗦了。

编辑我误读了OP,并将其视为答案。我投了the best solution