Python字典:从元组(一个键)中删除字符串

Python字典:从元组(一个键)中删除字符串,python,dictionary,Python,Dictionary,我有一本像这样的字典 dic ={('L', 'N', 'C'):6, ('N', 'L', 'C'):4, ('C', 'N', 'L'):3}) 我想从所有键中删除字符串“C”。 有什么有效的方法可以做到这一点吗 请注意,删除'C'会使('N','L','C')和('C','N','L')发生冲突,因为它们都变成('N','L')。从问题中不清楚您希望如何处理该问题。这可以通过一个单一的: for k,v in dic.iteritems(): if 'C' in k:

我有一本像这样的字典

dic ={('L', 'N', 'C'):6, ('N', 'L', 'C'):4, ('C', 'N', 'L'):3})
我想从所有键中删除字符串“C”。
有什么有效的方法可以做到这一点吗


请注意,删除
'C'
会使
('N','L','C')
('C','N','L')
发生冲突,因为它们都变成
('N','L')
。从问题中不清楚您希望如何处理该问题。

这可以通过一个单一的:

for k,v in dic.iteritems():
    if 'C' in k:
        dic[tuple(el for el in k if el!='C')] = dic.pop(k)
请注意,删除
'C'
会使
('N','L','C')
('C','N','L')
发生冲突,因为它们都变成
('N','L')
。这个问题不清楚你希望如何处理

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
在此解决方案中,
只有包含要消除的元素的键才会被更改(由于元组是不可变的,所以会有新的对象)。
词典已就地修改
并且这些值仍然是相同的对象

下面的代码显示了这一点

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

…答案中的代码通过保留最后一个看到的值来“处理”它。此代码创建一个新字典(即使用新id)。即使对于不包含“C”的键,也会执行
元组(如果l!=“C”),则l代表k中的l)
,使用新ID创建新键,即使它们具有相同的值。如果字典很大,那么所有这些都代表着无用的工作顺便说一句,如果古字典没有被销毁,它仍然存在。这似乎给出了元组,但元组的顺序都不同于原始元组。您能解释一下原因吗?@user1828603:如果您的意思是最后一本词典中的键顺序与原始词典中的键顺序不同,这是因为
dict
不保证其键的任何特定顺序……而您答案中的代码是“句柄”这段代码创建了一个新的字典(也就是说,使用一个新的id)。即使对于不包含“C”的键,也会执行
元组(如果l!=“C”),则l代表k中的l)
,使用新ID创建新键,即使它们具有相同的值。如果字典很大,那么所有这些都代表着无用的工作顺便说一句,如果古字典没有被销毁,它仍然存在。这似乎给出了元组,但元组的顺序都不同于原始元组。你能解释一下为什么吗?@user1828603:如果你的意思是最后一本词典中的键顺序与原始词典中的键顺序不同,这是因为
dict
不能保证其键的任何特定顺序