удалить элемент в списке в словаре - PullRequest
3 голосов
/ 30 марта 2012

В большом словаре, похожем на

d = {}                                                                                   
d['a']=[1,2,3,4]                                                                         
d['b']=[1,2,3,4,5,6]                                                                     
d['c']=[1,2]                                                                             
d['d']=[1,4]

как я могу быстро удалить «четыре» из списков?

EDIT

Есть ли способ связать четверки в списках? Как в случае, устранение одного устраняет других.

Ответы [ 5 ]

8 голосов
/ 30 марта 2012

Переберите значения словаря и удалите 4 из каждого списка:

for a in d.itervalues():
    try:
        a.remove(4)
    except ValueError:
        pass

Это не очень эффективно, поскольку удаление элемента из списка является операцией O (n).Используйте другой тип данных (например, набор) для лучшей производительности.

Если значения словаря являются наборами, вы можете сделать

for a in d.itervalues():
    a.discard(4)
1 голос
/ 30 марта 2012

Кажется, что вы могли бы получить пользу от создания своего словаря "Симметричный", вы могли бы сделать что-то вроде этого:

def make_symmetric(D):
    for key, value in D.items():
        for v in value:
            D.setdefault(v, set()).add(key)

def add(D, a, b):
    D.setdefault(a, set()).add(b)
    D.setdefault(b, set()).add(a)

def remove(D, a):
    values = D.pop(a)
    for v in values:
        D[v].remove(a)

И используйте это как-то так:

>>> d = {'a': set([1, 2, 3, 4]),
         'b': set([1, 2, 3, 4, 5, 6]),
         'c': set([1, 2]),
         'd': set([1, 4])}
>>> make_symmetric(d)
>>> d
{1: set(['a', 'c', 'b', 'd']),
 2: set(['a', 'c', 'b']),
 3: set(['a', 'b']),
 4: set(['a', 'b', 'd']),
 5: set(['b']),
 6: set(['b']),
 'a': set([1, 2, 3, 4]),
 'b': set([1, 2, 3, 4, 5, 6]),
 'c': set([1, 2]),
 'd': set([1, 4])}
>>> remove(d, 4)
>>> d
{1: set(['a', 'c', 'b', 'd']),
 2: set(['a', 'c', 'b']),
 3: set(['a', 'b']),
 5: set(['b']),
 6: set(['b']),
 'a': set([1, 2, 3]),
 'b': set([1, 2, 3, 5, 6]),
 'c': set([1, 2]),
 'd': set([1])}
>>> add(d, 'd', 4)
>>> d
{1: set(['a', 'c', 'b', 'd']),
 2: set(['a', 'c', 'b']),
 3: set(['a', 'b']),
 4: set(['d']),
 5: set(['b']),
 6: set(['b']),
 'a': set([1, 2, 3]),
 'b': set([1, 2, 3, 5, 6]),
 'c': set([1, 2]),
 'd': set([1, 4])}

Я использую наборы здесь, но вы можете сделать что-то подобное со списками. Я не удивлюсь, если уже где-нибудь будет реализована «симметричная» версия словаря. Надеюсь, кто-то еще может указать вам правильное направление, если оно существует.

0 голосов
/ 30 марта 2012

Если значения содержат дубликаты 4, вы можете использовать что-то вроде этого:

d = {}                                                                                   
d['a']=[1,2,3,4]                                                                         
d['b']=[1,2,3,4,4,5,6]                                                                     
d['c']=[1,2]                                                                             
d['d']=[1,4,4,4]

def remove_dup(x,n):
    while n in x:
        x.remove(n)
    return x

for ele in d.itervalues():
    try:
        remove_dup(ele,4)
    except ValueError:
        pass

Результат:

>>> d
{'a': [1, 2, 3], 'c': [1, 2], 'b': [1, 2, 3, 5, 6], 'd': [1]}
0 голосов
/ 30 марта 2012

Вы не упомянули, что хотите, если в вашем списке есть дубликаты.Решение, которое я написал (повторить, а затем удалить ..), не обрабатывает дубликаты.

>>> d = {'a':[1,2,3,4],'b':[1,2,3,4,5,6],'c':[1,2],'d':[1,4],'e':[1,4,4]}
>>> for l in d.values():
...     if 4 in l: l.remove(4)
... 
>>> d
{'a': [1, 2, 3], 'c': [1, 2], 'b': [1, 2, 3, 5, 6], 'e': [1, 4], 'd': [1]}

Это не очень эффективно, хотя.if 4 in l будет повторять список один раз, а l.remove() будет повторять список снова.

0 голосов
/ 30 марта 2012

Попробуйте удалить все 4:

for i in d:
    while 4 in d[i]:
       d[i].remove(4)

Я не знаю, как можно устранить все 4-ки сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...