Python Dictionary:从元组中删除一个字符串(WHICH是一个键。)

时间:2012-11-27 22:18:20

标签: python dictionary

我有一本像

这样的词典
dic ={('L', 'N', 'C'):6, ('N', 'L', 'C'):4, ('C', 'N', 'L'):3})

我想从所有键中删除字符串'C'。 有没有有效的方法呢

2 个答案:

答案 0 :(得分:5)

这可以使用一个dictionary comprehension

来完成
>>> 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}

请注意,删除'C'会导致('N', 'L', 'C')('C', 'N', 'L')发生冲突,因为它们都会成为('N', 'L')。从问题中你不清楚如何处理它。

答案 1 :(得分: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