2016-04-13 21 views
1

Birden çok sütun içeren sıralanmış bir csv dosyası var ve 1. sütunundaki bir öğenin değerini veya dizinini döndürmek istiyorum. Bu csv dosyası yaklaşık 300.000 ila 400.000 değerine sahip. Herhangi bir min fonksiyonundan kaçınmaya çalışıyorum, çünkü bu, uzun sürecek bir süredir ve bir saniyenin altında bir değere ihtiyacım var.Öğe bul Listedeki değerden küçük veya eşittir

Yani ne üzerinden bir liste halinde column1 girdilerini yukarı ekliyor yapıyorum:

with open('example.csv', 'r') as f: 
    reader = csv.reader(f, delimiter=';') 
    for row in reader: 
     array.append(int(row[0])) 

Ve bende uygun bir fonksiyon ve/veya örnek bulamadık çünkü artık zor kısmı geliyor Daha düşük veya eşit bir değer arıyorum. Bu örnek düzenleme çalıştı I Bu örnek, daha düşük, eşit veya daha büyük, en yakın değerini veren stackoverflow.com

def find_closest(t): 
idx = bisect.bisect_left(array, t) # Find insertion point 

# Check which timestamp with idx or idx - 1 is closer 
if idx > 0 and abs(array[idx] - value) > abs(array[idx - 1] - value): 
    idx -= 1 

return array[idx] 

üzerinde bulunmaktadır. Ama istediğim gibi değiştiremedim. Ben aradığım numaraları ile Örnek olarak

geçerli: değer1'e ararken
array=[123,123,123,124,125,125,125,128,128,128,128] 
value1=124 
value2=127 

Yani return1=124 veya dizin dönmelidir. Değer, value2 gibi eklenmediğinde, aranan değerden daha düşük en yüksek değeri döndürmelidir. Daha yüksek değer olan 128, daha yakın olsa bile return2=125.

Bütçe modülünü kullanmayı denedim, ancak sefil bir şekilde başarısız oldum. Herhangi bir ipucu takdir edilir.

Selamlar

+0

kolon 1, sonra sıralanır eğer ikili arama (bisection) belkide "Ben sefil başarısız" genişletmek, senin arkadaşın. – Tommy

cevap

0

Bu sıralı bir liste olduğunu varsayarak edilmektedir:

def foo(the_list, value): 
    index = bisect.bisect_left(the_list, value) 
    return the_list[index] if the_list[index] == value or index == 0 else the_list[index-1] 
+0

Çok teşekkürler! Dönüş değerini karıştırdım. Şimdi her şey çalışıyor. – Max

İlgili konular