2011-05-25 38 views
21

Listede (string) bir öğeye erişmem, o maddeyi (dize olarak) değiştirmem ve listeye geri koymam gerektiğini bir önsezim var aynı endekspython, listeden ürüne geri dön, listeye geri kaydet

nedeniyle bu çizgiye

for item in list: 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[item] = item 
     print item 

şimdi bir hatayı

TypeError: list indices must be integers, not str 

olsun aynı dizin içine geri bir öğe alma zorluğu yaşıyorum list[item] = item

anlamlıdır! ancak öğeyi python

ile aynı dizinde listeye nasıl geri koyacağımı bilmiyorum bunun için sözdizimi nedir?

for idx, item in enumerate(list): 
    if 'foo' in item: 
     item = replace_all(...) 
     list[idx] = item 
+1

Neden listede yer almak zorundasınız? Benim ilk tepkimem, bir liste anlama kullanmaktı: – krs1

+0

, 'tüfe' öğesinde 'foo' öğesinde liste halinde öğe için 0 = [replace_all (öğe, replaceDictionary)], ancak bu kadar farklı mıdır? – CQM

+0

Görebildiğim tek sorun, öğenin dizinini değil öğeyi kullanarak bir liste öğesine başvurmaya çalıştığınızdır. Bundan daha iyi görünüyor. Ayrıca, başvurmadan önce liste öğesini değiştiriyorsunuz. Sözlükler için bir sorun olabilir. – krs1

cevap

33

şu anda duyuyorum endeksi takip edebilirsiniz Ayrıca python docs

for place, item in enumerate(list): 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[place] = item 
     print item 

, şey python'da ayrılmış bir kelime olduğundan, değişken olarak kelime listesini kullanmak için kötü bir fikir.

Eğer enumerate ile ilgili sorunlar, itertools kütüphanesinden bir alternatif olduğu için: Bu tekrar yazılabilir

for i in range(len(L)): 
    item = L[i] 
    # ... compute some result based on item ... 
    L[i] = result 

:

for place, item in itertools.zip(itertools.count(0), list): 
    if "foo" in item: 
     item = replace_all(item, replaceDictionary) 
     list[place] = item 
     print item 
+0

'ValueError: paketini açmak için çok fazla değer var, listelerim için alanım tükendiğinden şüpheleniyorum, listeye daha fazla yer açmak için ne kadar yer kalmalı? (yeni bir soru olabilir) – CQM

+4

@RD .: Numaralandırdığınızdan emin misiniz? –

+0

ah, thise yazısında fark etmedi. Bu işe yaramış gibi görünüyor. Her ne kadar ben buna bir '' stringstring = '' .join (liste) 'dizgesine katılmaya çalıştığımda tekrar bellek alanı sorununa girmeme rağmen, bir nedenden dolayı konsola ne kadar ilerlediğini yazdırmaya karar verir ve tamamlamaz programın geri kalanı – CQM

5

Sen numaralandırmak işlevini kullanmanız gerekir: İdeal döngü ben bu yapabileceğini

2

Yaygın bir deyim listesi her eleman değiştirmek için şuna benzer kullanarak enumerate() kullanarak:

for i, item in enumerate(L): 
    # ... compute some result based on item ... 
    L[i] = result 

Bkz enumerate.

İlgili konular