2012-10-27 21 views
5

Bir dize s verildiğinde, dizede her karakterin kaç kez oluştuğunu bilmek istiyorum. Bu kodu çalıştırmak ve ben abbba girdiğinizdeBir python öğesinin öğeleri üzerinde yineleme nasıl yapılır

def main() : 
    while True : 
    try : 
     line=raw_input('Enter a string: ') 
    except EOFError : 
     break; 
    mp={}; 

    for i in range(len(line)) : 
     if line[i] in mp : 
     mp[line[i]] += 1; 
     else : 
     mp[line[i]] = 1; 

    for i in range(len(line)) : 
     print line[i],': ',mp[line[i]]; 

if __name__ == '__main__' : 
    main(); 

, alıyorum::

a : 2 
b : 3 
b : 3 
b : 3 
a : 2 

Ben sadece almak istiyorum:

a : 2 
b : 3 

neden Bunu anlamak İşte kod oluyor, ama python için yeni olduğum için, bir haritanın öğeleri üzerinde yinelemenin başka yollarını bilmiyorum. Bana bunu nasıl yapacağımı söyleyebilir misin? Şimdiden teşekkürler.

cevap

12

Bir Sayacı (Python 2.7 ve üstü; pre-2.7 seçeneği için aşağıya bakınız) deneyebilirsiniz:

>>> from collections import Counter 
>>> Counter('abbba') 
Counter({'b': 3, 'a': 2}) 

O zaman sadece bir sözlük gibi unsurları erişebilirsiniz:

>>> counts = Counter('abbba') 
>>> counts['a'] 
2 
>>> counts['b'] 
3 

ve yineleme, sen BurhanKhalid önerisine @ kullanabilirsiniz (eğer anahtarın adımlayabilirsiniz bir sözlük olarak Counter davranır/değer çiftleri):

>>> for k, v in Counter('abbba').iteritems(): 
... print k, v 
... 
a 2 
b 3 

Python'un 2.7 öncesi bir sürümünü kullanıyorsanız, kodunuzu biraz kolaylaştırmak için bir defaultdict kullanabilirsiniz (işlem yine de aynıdır - yalnızca fark şu ki, önce anahtarı kontrol etmeniz gerekmez - Eşleşen bir anahtar bulunmazsa 'varsayılan' olur '). Counter yerleşik diğer özelliklere sahiptir, ancak sadece sayımlarını istediğiniz (ve yaklaşık most_common umurumda değil, ya örneğin subtract edememek), bu iyi olmalı ve başka herhangi bir sözlük olarak sadece tedavi edilebilir:

>>> from collections import defaultdict 
>>> counts = defaultdict(int) 
>>> for c in 'abbba': 
... counts[c] += 1 
... 
>>> counts 
defaultdict(<type 'int'>, {'a': 2, 'b': 3}) 

bir sözlük (veya burada Counter/defaultdict) üzerinde iteritems() kullandığınızda, bir anahtar ve bir değer her yineleme için döndürülür (bu durumda, mektup ve gerçekleşme sayısı olan değerini olmak tuşu). Sözlükleri kullanmayla ilgili dikkat edilmesi gereken bir şey, doğal olarak sırasız olmalarıdır. Bu nedenle, yineleme yaparken 'a', 'b', ...'u almanız gerekmez. Sıralı bir şekilde bir sözlükte yinelemenin temel bir yolu, tuşların sıralanmış bir listesi (burada alfabetik, ancak sorted çeşitli seçenekleri işlemek için değiştirilebilir) ve bu anahtar için sözlük değerini döndürür (orada). başka yolları vardır, ancak bu umutla) biraz bilgilendirici olacaktır:

>>> mapping = {'some': 2, 'example': 3, 'words': 5} 
>>> mapping 
{'some': 2, 'example': 3, 'words': 5} 
>>> for key in sorted(mapping.keys()): 
... print key, mapping[key] 
... 
example 3 
some 2 
words 5 
+0

Güzel cevap, ama bana sayaçtaki elemanlar üzerinde nasıl yineleme yapılacağını söyleyebilir misiniz? –

+0

'k, v için Sayaç ('aaaabbbcccddd'). Iteritems():' –

+0

@RondogiannisAristophanes Elbette ki (Ignacio'nun gönderi aşağıdaki en basit yolu gösterir). – RocketDonkey

6

yineleme bir mapping anahtarlarını verir bitti.

>>> d = {'foo': 42, 'bar': 'quux'} 
>>> for k in d: 
... print k, d[k] 
... 
foo 42 
bar quux 
+0

Çalıştı, teşekkürler. –

+0

@RondogiannisAristophanes: 'Koleksiyonlar.Counter' bir haritalama olduğundan, aynı şekilde bir tane üzerinde yineleyebilirsiniz. – martineau

2

dict() için yardıma ihtiyacınız var. Her şey var - 'mp'de k için' iteratlar tuşlar üzerinden 'mp.values ​​()' de v için değerler üzerinde yineleme, 'için k, v için mp.items()' anahtar, değer çiftleri üzerinde yineleyin.

Ayrıca, bu noktalı virgüllere ihtiyacınız yoktur. Python'da yasal olsalar da, kimse onları kullanmaz, oldukça fazla bir sebep yok.

1

Python 2.5 ve üstü

dDIct = collections.defaultdict(int) 
    [(d[i]+=1) for i in line] 
    print dDict 
+0

“collections.defaultdict'” anlamına geldiğine inanıyorum :) – RocketDonkey

+0

@RocketDonkey: Evet, akıllı telefonunuzu kullandığınızda olur ;-) – Michael

+0

Haha, bilmiyorum :) – RocketDonkey

İlgili konular