2012-02-18 17 views
5

belirli anahtar-değer çiftlerini içeren bir Python sözlük oluştur Ben şuna benzer bazı kodlar vardır:başka sözlükte

d = {'foo': True, 'bar': 42, 'baz': '!'} 

a = {'foo': d['foo'], 'bar': d['bar']} 
b = {'foo': d['foo'], 'baz': d['baz']} 
c = {'bar': d['bar'], 'baz': d['baz']} 

Şüphesiz bu ifade etmek daha iyi bir yol var. Bu amaçla bir fonksiyon yazabiliriz

# I'd hoped that something like this would work... 
a = d.copy('foo', 'bar') 
b = d.copy('foo', 'baz') 
c = d.copy('bar', 'baz') 

:

copydict = lambda dct, *keys: {key: dct[key] for key in keys} 

a = copydict(d, 'foo', 'bar') 
b = copydict(d, 'foo', 'baz') 
c = copydict(d, 'bar', 'baz') 

orada daha iyi mi aslında bir Sözlüğün copy yöntem yeni sözlüğe dahil edilecek anahtarları kabul umuduyla dokümanlar okumak Yukarıdakilerden daha mı?

+0

Neden a, b, c için bir liste (veya set) kullanmıyorsunuz? Soğuktu, ihtiyacın olduğunda d'deki değere bak. – maxy

+0

Aslında 'a',' b' ve 'c' Django'nun' urlencode' işlevine geçiyorum ('urllib.urlencode' gibi bir sözlük kabul eder). – davidchambers

+0

@BlaXpirit: Sadece "Hayır" içeren bir cevap yazmalısınız. (bir HTML yorumu ile minimum boyuta geçin) böylece hepimiz çılgınca oy verebiliriz. –

cevap

5

Sanırım buradaki işlev en iyi çözümdür. Tabii ki, birileri bazı deyim kodları yayınlayabilir, ama eminim ki daha iyi/daha hızlı çalışmaz. Bir listeyi yinelemek ve bir anahtardan bir kalemle öğeler almak, alabildiğince hızlıdır.

Bir öneri, yıldızı keys parametresinden kaldırmaktır. Bağımsız değişken açma, gereksiz ek yük ekler. Bu anahtarları bir tuple geçirmenin bir problemi olmamalı.

@BlaXpirit tarafından işaret edildiği gibi
0

, bu çözüm muhtemelen hız veya okunabilirliği açısından seninkinden daha iyi olacak değil, ancak böyle bir şey yapabileceğini:

>>> from operator import itemgetter 
>>> d = {'foo': True, 'bar': 42, 'baz': '!'} 
>>> keys = ['foo', 'bar'] 
>>> dict(zip(keys, itemgetter(*keys)(d))) 
{'bar': 42, 'foo': True} 
3

yapardım tek gelişme yapmak gerçek işlevi tanımı kullanmaktır değil, bir lambda:

def copy_dict(d, *keys): 
    """Make a copy of only the `keys` from dictionary `d`.""" 
    return {key: d[key] for key in keys} 

O anahtarları eksik başa yararlı olabilir, ama sen bulabilirsin böylece Python 2'de sen güzel * args ile opsiyonel anahtar kelime argümanları karştramazsnz Bir tuple argümanına gitmek zorunda:

def copy_dict(d, keys, default=None): 
    """Make a copy of only the `keys` from dictionary `d`. 

    Use `default` if a key is missing. 

    """ 
    return {key: d.get(key, default) for key in keys} 
İlgili konular