删除字典中列表中的元素

时间:2012-03-29 22:28:37

标签: python list dictionary

在一本大词典中,类似于

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

如何快速删除列表中的“四个”?

修改

有没有办法链接列表中的四肢?如同,消除一个消除了其他。

5 个答案:

答案 0 :(得分:8)

迭代字典的值并从每个列表中删除4:

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

这不是很有效,因为从列表中删除元素是O(n)操作。使用不同的数据类型(例如一组)以获得更好的性能。

如果字典值已设置,则可以

for a in d.itervalues():
    a.discard(4)

答案 1 :(得分:1)

看起来您可能会从使字典“对称”中受益,您可以这样做:

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])}

我在这里使用套装,但你可以用列表做类似的事情。如果已经在某处实现了“对称”字典,我不会感到惊讶。希望其他人可以指出你是否存在正确的方向。

答案 2 :(得分:0)

尝试此操作删除所有4:

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

我不知道你可以一次消除所有4s的方法。

答案 3 :(得分:0)

如果列表中有重复项,您没有提到您想要发生的事情。我写的解决方案(迭代然后删除..)不处理重复。

>>> 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()将再次迭代列表。

答案 4 :(得分:0)

如果值包含重复的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]}