2014-06-17 28 views
5

Novice programmer burada. Kendi Kendine Öğrenme Python. Stackoverflow hakkında ilk soru.Python'da birden fazla veri yapısı (dicts) oluşturma

Kullanıcının fiyat, değerlendirme ve mutfak türü seçimini temel alarak bir restoran önermek üzere bir program yazmaya çalışıyorum. Bunu başarmak için, program üç veri yapılarını oluşturur:

#Rest name 
#Rest Rating 
#Rest Price range 
#Rest Cuisine type 
# 
#Rest2 name 

vb

:

# Initiating the data structures 

name_rating = {} 
price_name = {} 
cuisine_name = {} 

verileri aşağıdaki biçimlendirme ile restaurants.txt gelir [I, bir ara aşamada hala değilim]

izleyen fonksiyon, arzu edilen dizi sadece dize döndürür

# The get_line function returns the 'line' at pos (starting at 0) 
def get_line(pos): 
    fname = 'restaurants.txt' 
    fhand = open(fname) 
    for x, line in enumerate(fhand): 
     line = line.rstrip() 
     if not pos == x: continue 
     return line 


# Locating the pos's of name, rate, price & cuisine type for each restaurant 
# Assumes uniform txt file formatting and unchanged data set 

name_pos = [x for x in range(0,84,5)] 
rate_pos = [x for x in range(1,84,5)] 
price_pos = [x for x in range(2,84,5)] 
cuis_pos = [x for x in range(3,84,5)] 

Increme Her restoran için ayrı ayrı veri almak için 5 ile nts.

fname = 'restaurants.txt' 
fhand = open(fname) 

aşağıdaki döner adının bir sözlük: derecelendirme

# Builds the name_rating data structure (dict) 
def namerate(): 
    for x, line in enumerate(fhand): 
     line = line.rstrip() 
     for n, r in zip(name_pos, rate_pos): 
      if not n == x: continue 
      name_rating[line] = name_rating.get(line, get_line(r)) 
    return name_rating 

aşağıdaki getiri

fiyatın bir sözlüğü: işlevlerini

print pricename() 
print namerate() 

questio çağrılması

# Builds the price_name data structure (dict) 
def pricename(): 
    for x, line in enumerate(fhand): 
     line = line.rstrip() 
     for p, n in zip(price_pos, name_pos): 
      if not p == x: continue 
      price_name[line] = price_name.get(line, get_line(n)) 
    return price_name 

isim N: Fonksiyonları aradığımda, neden sadece ilk aradığımın başarılı olduğu oluyor? İkinci dict boş kalır. Onları ayrı ayrı ararsam, veri yapıları inşa edilir. İkisini de ararsam, sadece ilk başarılı olur.

p.s. Eminim tüm bunları daha hızlı yapabilirim ama şimdilik kendim yapmaya çalışıyorum, bu yüzden bazıları gereksiz veya gereksiz görülebilir. Lütfen benimle ayı :)

+2

bir belgeyi açıp ilk fonksiyonunda okuma, bunu sonuna ulaşmak ve sonra ikincisinizle, * sonundan daha fazla * okumaya çalışıyorsunuz, bu nedenle –

cevap

1

Tekrar seek yöntemi kullanarak başlangıç ​​dosya konumunu ayarlayabilirsiniz (docs bakınız):

f = open("test.txt") 

for i in f: 
    print(i) 
# Print: 
    # This is a test first line 
    # This is a test second line 

for i in f: 
    print(i) 
# Prints nothig 

f.seek(0) # set position to the beginning 

for i in f: 
    print(i) 
# Print: 
    # This is a test first line 
    # This is a test second line 
+0

Gotcha mümkün değil. sıfırlamak için gerekli olduğunu bilmiyordum. şerefe – Abd00s

+0

Açıkça belirtilmemiş olan buradaki belirgin bir nokta, bir dosya nesnesinin durumsal olduğunu ve dosya sonuna ulaşana kadar ileriye doğru hareket eden bir imlecin ("konum") olduğunu ve daha sonra okuyamayacağınızı veri nesnesi üzerinde daha fazla '' 'iterasyonlar yürütülmez. Bir yol önerilen yoldur, ancak bu problemin başka yolları da vardır: Biri dosyayı her işlev içinde yeniden açmaktır. Bir diğeri, dosyayı bir bellek arabelleğine okumak ve ardından bunun üzerinde işlem yapmak, diğeri ise çoklayıcı bir işleyiciye sahip olmaktır. Yeniden açılmayı/aramayı tekrar yapmak iyi bir şey değil, ama ölçeğidir. –