Çoktan çoğa korelasyonlu bir grup tuple gidiyorum, ve her b (a, b) 'nin b'ye karşılık gelen bütün harflerin bir listesine sahip olduğu bir sözlük yapmak istiyorum. Sözlükteki anahtar b'deki bir listeyi sınamak, sonra bir a aramak, sonra zaten yok ise, her seferinde tuple sindirim döngüsü boyunca ekleme yapmak garip görünüyor; ama henüz daha iyi bir yol bulamadım. Biri var mı? Bunu yapmanın başka bir yolu var mı daha güzel?Bir liste oluşturmanın veya zaten var ise ona ekleme yapmanın etkili yolu?
cevap
setdefault()
yöntemi için the docs bakınız:
setDefault (anahtar [varsayılan])
anahtar değerini geri, sözlükte değilse. Değilse, anahtarı varsayılan değerine ekleyin ve varsayılanı döndürün. Varsayılan varsayılanı Yok'dur.
Bunu mevcut veya zaten mevcut değilse boş bir listeye b ayarlarsanız b alacak tek bir çağrı olarak kullanabilirsiniz - ve ya bir şekilde, dönüş b:
>>> key = 'b'
>>> val = 'a'
>>> print d
{}
>>> d.setdefault(key, []).append(val)
>>> print d
{'b': ['a']}
>>> d.setdefault(key, []).append('zee')
>>> print d
{'b': ['a', 'zee']}
üç hatlarında peşinde olduğun kontrol "değil" basit bir ile birleştirin ve yaptığın:
>>> b = d.setdefault('b', [])
>>> if val not in b:
... b.append(val)
...
>>> print d
{'b': ['a', 'zee', 'c']}
'defaultdict', Python 2.5 veya üstü olduğunu varsayarak, 'setdefault''dan biraz daha güzel. – ephemient
2.34 ile sıkışıp kaldım, bu yüzden bu benim için bir cevap - teşekkürler, James! – user249228
D'oh. 'set()' güzel ama 2.4'e kadar yerleşik değil. Neden senin Python'un çok yaşlı? :-( – ephemient
Eğer tuples O sıralayabilirsiniz ardından sözlük O (n) oluşturmak (n log n)
veya simplier O (n) ama birçok dizilerini durumunda hafızasına ağır yük dayatabildiğinı:
your_dict = {}
for (a,b) in your_list:
if b in your_dict:
your_dict[b].append(a)
else:
your_dict[b]=[a]
Hmm, anlattığınız ile hemen hemen aynı. Bu garip olan ne?
Kirli işleri yapmak için bir sql veritabanı kullanmayı da düşünebilirsiniz.
Daha basit bir yöntem, bu arada, O (n) 'dir, bu nedenle tuples yönteminizi sıralamak tercih edilir. – kennytm
evet, düzenlenmiş sürümde de belirttim. –
Reddetme hakkındaki yorumlarınız var mı? –
Sana önemli bir sınav çıkmak nasıl emin değilim, ama anahtar/değer çifti başlatıldı kez kolay :)
d = {}
if 'b' not in d:
d['b'] = set()
d['b'].add('a')
seti sağlayacaktır sadece 1 'bir o 'koleksiyonda. Anahtar/değer bulunduğundan emin olmak için başlangıçtaki 'b' kontrolünü yapmanız gerekir.
meraklı neden -1? bu bir şekilde yanlış mı? Cevabı yanlışsa sileceğim. –
gerçekten listelere bağlı değiliz varsayarsak, defaultdict ve set oldukça kullanışlıdır.
import collections
d = collections.defaultdict(set)
for a, b in mappings:
d[b].add(a)
Eğer gerçekten yerine setleri listeleri istiyorsanız, bir
for k, v in d.iteritems():
d[k] = list(v)
ile bunu takip edebiliyoruz Ve gerçekten yerine defaultdict bir dicti isterseniz
söyleyebilirizd = dict(d)
Gerçekten de, herhangi bir sebep görmüyorum.
ah evet, bu, hiçbir şey için ilk kontrolün etrafında olur. Teşekkürler! Yeni bir şey öğrendim :) –
+1, defaultdict' için, çünkü gerçekten en Pythonic çözümü. – jathanism
Ben de nasıldı [bu adam bana varsayılanla gelmeme yardımcı oldu (lambda: defaultdict (list))] (http://ohuiginn.net/mt/2010/07/nested_dictionaries_in_python.html) – lkraav
Koleksiyonları kullanın.Bunun yerine bir if
kullanmanın
your_dict = defaultdict(list)
for (a,b) in your_list:
your_dict[b].append(a)
defaultdict AFAIK bu pythonic daha yerine try
blok kullanmaktır.
your_list=[('a',1),('a',3),('b',1),('f',1),('a',2),('z',1)]
your_dict={}
for (a,b) in your_list:
try:
your_dict[b].append(a)
except KeyError:
your_dict[b]=[a]
print your_dict
Dict get
yöntemi? Bu some_key
sözlükte ise my_dict[some_key]
değerini verir ve eğer değil - (aşağıdaki örnekte []
) bazı varsayılan değeri döndürür:
my_dict[some_key] = my_dict.get(some_key, []).append(something_else)
(sanki belki verimli değildir oldukça verimli olan başka yolu yok setleri) ve basit. Pratikte defaultdict
'a benzer, ancak ek bir ithalat gerektirmez. Boş (Yok) tuşları ile bir zorunluluğunuz olduğunu varsayalım, bu aynı zamanda bir yerde dict tuşları yarattığınız anlamına gelir. Bunu dict.fromkeys
yöntemiyle yapabilirsiniz ve bu yöntem ayrıca tüm tuşlara varsayılan bir değer koymaya izin verir. result
olacak
keylist = ['key1', 'key2']
result = dict.fromkeys(keylist, [])
: { 'key1': [], 'anahtar2': []}
Sonra döngü yapmak ve sözdizimsel demek güzel tarafından result['key1'].append(..)
doğrudan
- 1. uiimage'den küçük resim oluşturmanın etkili yolu
- 2. Boş ListBuffer oluşturmanın en etkili yolu nedir?
- 3. Liste görünümünü doldurmanın etkili yolu
- 4. Java'da sıralanmamış bir ikili ağaç oluşturmanın en etkili yolu nedir?
- 5. PySpark'ta sıralanmış bir küçülme yapmanın en etkili yolu nedir?
- 6. Bir öğenin zaten ona uygulanmış jquery select2 olup olmadığını kontrol etmenin bir yolu var mı?
- 7. cuBLAS'da "saypx" yapmanın bir yolu var mı?
- 8. Bu iki foreach döngüsünü yapmanın en etkili yolu nedir?
- 9. (Toplu) Tıklanabilir düğmeler yapmanın bir yolu var mı?
- 10. Gps dosyalarından google haritalarda rota oluşturmanın en etkili yolu nedir?
- 11. Linux'ta kullanıcı tanımlı bir sinyal oluşturmanın bir yolu var mı?
- 12. Trigger.io için yerel eklentiler oluşturmanın bir yolu var mı?
- 13. Bir Arabirimi destekleyen bir DynamicObject oluşturmanın bir yolu var mı?
- 14. Div Scrollbar - Stil oluşturmanın herhangi bir yolu var mı?
- 15. ASCX yapmanın MVC yolu var mı?
- 16. C# ciltleme işlemini statik olarak yapmanın bir yolu var mı?
- 17. JavaFX'te yol gradyanı oluşturmanın herhangi bir yolu var mı?
- 18. Python'da sınıf özelliği oluşturmanın bir yolu var mı?
- 19. Test verilerinin bulunduğu bir örnek oluşturmanın bir yolu var mı?
- 20. Bir URL oluşturmanın doğru yolu var mı? Orada çalışmak kod çoğunda
- 21. Bir Cassandra sorgusunu "EXPLAIN" yapmanın bir yolu var mı?
- 22. Tkinter ile şeffaf pencereler oluşturmanın bir yolu var mı?
- 23. En etkili yolu
- 24. Julia-lang'de paket bağımlılık ağacı oluşturmanın bir yolu var mı?
- 25. Bir liste döndürürseniz, zaten bir rowmapper uygulamamız var
- 26. şöyle bir liste var
- 27. Titreyen çizgi çekmeden bir çizgi oluşturmanın bir yolu var mı?
- 28. Bir değişkene NodeJs Express görünümü oluşturmanın bir yolu var mı?
- 29. jQuery: özyinelemeli bir çocuk seçici oluşturmanın bir yolu var mı?
- 30. Paketli Eklentiler listesini otomatik olarak oluşturmanın bir yolu var mı?
kullanabilirsiniz veya algoritmik olarak? –