2012-11-27 28 views
0

我有一個像的Python解釋:從元組移除一個字符串

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

我想從所有鍵刪除字符串「C」字典(這是關鍵)。 有這樣

+0

Questioàn奇怪的類似http://stackoverflow.com/questions/13571438/remove-a-value-from-a-dictionary-with-multiple-values – eyquem

回答

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')。這個問題並不清楚你希望如何處理這個問題。

+0

.. 。你的答案中的代碼通過只保留最後一個值的方式「處理」它。 – martineau

+0

這段代碼創建一個新的字典(也就是說用一個新的id)。即使對於不包含'C'的鍵,也執行'元組'(如果l!='C'則執行l'),即使它們具有相同的值,也會使用新的ID創建新鍵。如果字典很大,所有這些都代表無用的工作。 - 順便說一下,如果古代字典沒有被破壞,它仍然存在。 – eyquem

+0

這似乎給了元組,但元組的順序與原始元組都是不同的。你能解釋一下爲什麼請問? – user1828603

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 
相關問題