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 ararkenarray=[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
kolon 1, sonra sıralanır eğer ikili arama (bisection) belkide "Ben sefil başarısız" genişletmek, senin arkadaşın. – Tommy