0

我有一本字典

dic ={('L', 'N', 'C'):6, ('N', 'L', 'C'):4, ('C', 'N', 'L'):3})

我想从所有键中删除字符串“C”。有什么有效的方法吗

4

2 回答 2

5

这可以通过一个字典理解来完成:

>>> dic ={('L', 'N', 'C'):6, ('N', 'L', 'C'):4, ('C', 'N', 'L'):3}
>>> {tuple(l for l in k if l != 'C'):v for k,v in dic.items()}
{('L', 'N'): 6, ('N', 'L'): 4}

请注意,将 make 和冲突删除,'C'因为('N', 'L', 'C')它们('C', 'N', 'L')都变为('N', 'L'). 从问题中不清楚您希望如何处理它。

于 2012-11-27T22:19:54.137 回答
0
for k,v in dic.iteritems():
    if 'C' in k:
        dic[tuple(el for el in k if el!='C')] = dic.pop(k)

在此解决方案中,
仅更改包含要消除的元素的键(新对象,因为元组是不可变的)。
字典已就地修改,
值保持不变。

以下代码显示了这一点。

dico = {(1,2,8):'aa',  
        (25,8,45,9):'gerard',
        (268,54,0):'marine',
        (81,3,8,7):'emma',
        (7,9,6):'louis'}

print '  id(dico) : ',id(dico)
for k,v in dico.iteritems():
    print id(k),'%-25s' % repr(k),id(v),v

idk = [id(el) for el in dico]

for k,v in dico.iteritems():
    if 8 in k:
        dico[tuple(el for el in k if el!=8)] = dico.pop(k)

print
print '  id(dico) : ',id(dico)
for k,v in dico.iteritems():
    print '%d %-30s %d %s' %\
          (id(k), ('[new id] ' if id(k) not in idk else '         ')+repr(k),id(v),v)

结果

  id(dico) :  18737456
18751976 (268, 54, 0)              18718464 marine
11258576 (1, 2, 8)                 18566968 aa
18539072 (25, 8, 45, 9)            18603776 gerard
18606768 (81, 3, 8, 7)             18718432 emma
18752056 (7, 9, 6)                 18718592 louis

  id(dico) :  18737456
18752216 [new id] (1, 2)                18566968 aa
18751976          (268, 54, 0)          18718464 marine
18752176 [new id] (81, 3, 7)            18718432 emma
18752056          (7, 9, 6)             18718592 louis
18752416 [new id] (25, 45, 9)           18603776 gerard
于 2012-11-28T03:56:57.297 回答