SORU
8 Mayıs 2012, Salı


Nasıl karşılık gelen değerlere göre sözlük anahtarları filtre

Var:

dictionary = {"foo":12, "bar":2, "jim":4, "bob": 17}

Anahtarları yerine değerler üzerinden bu sözlük, ama yinelemek istiyorum, başka bir işlevi değerleri kullanabilirsiniz.

Örneğin, sözlük değerleri 6, daha büyük olan test etmek istiyorum ve sonra da listedeki anahtarları saklayın. Benim kod bu gibi görünüyor:

list = []
for c in dictionary:
    if c > 6:
        list.append(dictionary[c])
print list

ve sonra, mükemmel bir dünyada, list 6daha büyük olan tüm tuşları özelliği. Ancak, for döngüm sadece anahtarları içinde dolaşmak; değerleri değiştirmek istiyorum!

Herhangi bir yardım büyük beğeni topluyor. teşekkür ederim

CEVAP
8 Mayıs 2012, Salı


>>> d = {"foo": 12, "bar": 2, "jim": 4, "bob": 17}
>>> [k for k, v in d.items() if v > 6] # Use d.iteritems() on python 2.x
['bob', 'foo']

Sadece ayrıca @günlerde kullanmak için kendimi eğilimi olan glarrain tarafından çözüm vitrin için bu cevap güncellemek istiyorum.

[k for k in d if d[k] > 6]

Bu tamamen çapraz uyumlu ve gerektirmez kafa karıştırıcı değişikliği .iteritems (.iteritems önler tasarrufu listesi için bellek üzerinde Python 2. sabit Python 3) .items.

@Prof. Falken bu soruna bir çözüm bahsetti

from six import iteritems

etkili çapraz uyumluluk sorunları giderir AMA paketi six indirmek için gerektirir

Ben istiyorum ki tamamen katılıyorum @glarrain bu çözüm daha okunabilir olduğunu tartışacak ve belki de sadece kişisel bir tercih olsa da Python için gerekiyor sadece 1 var. Bence durumu (örn. bağlıdır değerleri daha okunabilir vermek istiyorum iki kez yazın ya da istemezsin sözlük uzun bir isim ya da başka bir nedenle adı) olabilir

İlginç zamanlama:

Python 2, 2. çözüm daha hızlı, neredeyse çiğ hız bakımından eşit oldukları Python 3'te.


$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 0.772 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.iteritems() if v > 6]'
1000000 loops, best of 3: 0.508 usec per loop
$ python -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 0.45 usec per loop

$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k, v in d.items() if v > 6]'
1000000 loops, best of 3: 1.02 usec per loop
$ python3 -m timeit -s 'd = {"foo": 12, "bar": 2, "jim": 4, "bob": 17};' '[k for k in d if d[k] > 6]'
1000000 loops, best of 3: 1.02 usec per loop

Ancak bu sadece küçük sözlük için testler vardırbüyüksözlük sözlük anahtar araması (d[k]) olmaması .items çok daha hızlı olurdu eminim. Ve bu durum böyle görünüyor

$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 1.75 sec per loop
$ python -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.iteritems() if v > 6]'
1 loops, best of 3: 1.71 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k in d if d[k] > 6]'
1 loops, best of 3: 3.08 sec per loop
$ python3 -m timeit -s 'd = {i: i for i in range(-10000000, 10000000)};' -n 1 '[k for k, v in d.items() if v > 6]'
1 loops, best of 3: 2.47 sec per loop

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012