2015-07-29 24 views
6

Listeden her öğeden bir anahtarı ve listeden bir sonraki öğeden değer (ler) içeren ve bu sayının sayısı için bir sayı olan sözlükler eklemeye çalışıyorum onu sözlük biçiminde takip eder. Örneğin, ['The', 'cat', 'chased', 'the', 'dog'] sözcüklerinin listesi varsa ve anahtar "o" ise, değerlerin {‘köpek’: 1, ‘kedi’: 1} olmasını isterim. Tüm çıktı {‘the’: {‘dog’: 1, ‘cat’: 1}, ‘chased’: {‘the’: 1}, ‘cat’: {‘chased’: 1}} olmalıdır.Python'daki bir sözlükte değer için sözlük oluşturma

Şu ana kadarki kodum anahtar ve değerler üretebilir, ancak sözlüğünde sözlük biçiminde değil. Birisi bu konuda yardımcı olabilir mi?

Kodum:

line = ['The', 'cat', 'chased', 'the', 'dog'] 
output = {} 
for i, item in enumerate(line): 
    print(i, item, len(line)) 
    if i != len(line) - 1: 
     output[item] = line[i+1]=i 
print(output) 

Çıktı:

{'The': 'cat', 'chased': 'the', 'the': 'dog', 'cat': 'chased'} 
+0

Sana çıktı yaratırım anlamıyorum .. Daha lütfen açıklayabilir misiniz? – Maroun

+0

önce, çıkış [item] = satır [i + 1] = i 'çıktı [item] = satır [i + 1]', aksi halde gösterilen çıktı olmaz. Burada öncelikle öğenin önce anahtar olarak var olup olmadığını kontrol etmeniz gerekiyor. Ardından, olmaması durumunda, {line [i + 1]: 1} ile bir dict oluşturun. Varsa, sadece ilgili değere 1 ekleyin. [...] bekle, sadece istediğini gördün '' {'köpek': 1, 'kedi': 1} ... '. Sonra biraz farklı. 1 Moment – Klaster

+0

'' dog '' dememeli: {"the"} 'de aynı zamanda dict? –

cevap

2

Bunun için collections.Counter kullanabilirsiniz. Örnek -

line = ['The', 'cat', 'chased', 'the', 'dog','the','dog'] 
from collections import Counter 
output = {} 
for i, item in enumerate(line): 
    print(i, item, len(line)) 
    if i != len(line) - 1: 
     output.setdefault(item.lower(),Counter()).update(Counter({line[i+1]:1})) 

print(output) 

.setdefault() ilk kontroller buna ikinci argüman olarak ayarlar ve bu tuşun en değerini döndürür yoksa anahtar, varsa.

Sayaçta, .update()'u yaptığınızda, anahtar zaten mevcutsa, sayımı 1 artırır, bu nedenle durumunuz için kullanılacak doğru yapı gibi görünür.

Ayrıca, Sayaç normal sözlüğe benziyor, böylece daha sonra bunları herhangi bir sözlük gibi kullanabilirsiniz. belki gibi

>>> line = ['The', 'cat', 'chased', 'the', 'dog','the','dog'] 
>>> from collections import Counter 
>>> output = {} 
>>> for i, item in enumerate(line): 
...  print(i, item, len(line)) 
...  if i != len(line) - 1: 
...   output.setdefault(item.lower(),Counter()).update(Counter({line[i+1]:1})) 
... 
0 The 7 
1 cat 7 
2 chased 7 
3 the 7 
4 dog 7 
5 the 7 
6 dog 7 
>>> print(output) 
{'dog': Counter({'the': 1}), 'cat': Counter({'chased': 1}), 'chased': Counter({'the': 1}), 'the': Counter({'dog': 2, 'cat': 1})} 
+0

'' '' '' 'köpeği '' takip ettim, girdiyi biraz daha karmaşık bir senaryo göstermek için biraz değiştirdim. Lütfen çıktıyı OP'nin sorusu ile karşılaştırmayın, demodan gerçek girdiyle karşılaştırın. –

+0

Giriş farkını fark etmediğim için üzgünüm. – LittleQ

4

bunu test etmedi ama bir şey -


Demo (a 'dog' iki kez 'the' takip senaryoyu göstermek için modifiye girişi not Lütfen)? defaultdict kullanma: Sizin için sorun neden oluyor çizgi gibi görünüyor

from collections import defaultdict 

line = ['The', 'cat', 'chased', 'the', 'dog'] 
output = defaultdict(lambda: defaultdict(int)) 

for t, token in enumerate(line[:-1]): 
    output[token.lower()][line[t + 1].lower()] += 1 
0

bu çizgidir: dikkate almayan gibi

output[item] = line[i+1]=i 

görünüyor bu çıkışı [item] should bir sözlüke işaret eder. Kelimeleri doğru bir şekilde karşılaştırmak için küçük harflere ihtiyaç duyduğunuza benziyor.

ben aşağıdaki kodla istediği çıkışı elde edebilir:

line = ['The', 'cat', 'chased', 'the', 'dog'] 
output = {} 
length = len(line) # I didn't wanted to check this each iteration 
for i, item in enumerate(line): 
    item = item.lower() 
    if i != length - 1: 
     next_word = line[i + 1].lower() 
     if item in output: 
      output[item][next_word] = 1 
     else: 
      output[item] = {next_word: 1} 
print(output) 
İlgili konular