Удалите данный элемент из другого набора в одном из двух наборов - PullRequest
2 голосов
/ 30 июля 2010

У меня есть dict, { "foo": set(["a", "b"]), "bar": set(["c", "d"]) }, и мне дан элемент одного из двух наборов и имя набора other Мне нужно удалить этот элемент. Как бы я поступил так? Моя лучшая попытка на данный момент такова:

keys = dict.keys()
if Element in dict[keys[0]].union(dict[keys[1]]):
  dict[keys[abs(keys.index(Other_Set) - 1)]].remove(Element)

Это кажется немного чрезмерным; Есть ли способ, как я могу улучшить это?

Ответы [ 7 ]

3 голосов
/ 30 июля 2010

Попробуйте это:

dictionary['foo' if otherset == 'bar' else 'bar'].discard(element)
2 голосов
/ 30 июля 2010

Используйте словарь, чтобы найти другой набор:

>>> 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'])}
1 голос
/ 30 июля 2010

Это может подойти вам, если вы априори не знаете названия клавиш в 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'])}
1 голос
/ 30 июля 2010

Как насчет:

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

С discard вы не получите KeyError, если элемента нет в наборе.Таким образом, вам не нужен ваш чек (другая альтернатива - просто игнорировать KeyError).И 1 - устраняет необходимость в abs.

0 голосов
/ 11 декабря 2010

Это гораздо более "питонический" способ:

>>> 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, имеющим пользовательский ввод или что у вас.

Напомним, что операторы - & ^ | в наборах перегружены для соответствующих методов мутирования:

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' на месте.Все эти другие решения, предлагаемые здесь, кажутся мне слишком многословными.

Редактировать Я неправильно прочитал ОП и игнорирую это как ответ.Я проголосовал за лучшее решение .

0 голосов
/ 30 июля 2010

Мой вариант, общий для любого количества комплектов, вынимает данный предмет для всех остальных:

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'])}
"""
0 голосов
/ 30 июля 2010
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...