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とclashの両方が。になるため、それらを削除することに注意して'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 に答える