我有一个字典{ "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)
但是,这似乎有点过分;有什么方法可以改进吗?
答案 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。