我有2个文件。一个(让我们说文件F1)是一个cvs文件,有大约200K行和3列。每行表示一个间隔,行按递增顺序排列。例如:
1000,1340,yes
1400,1800,no
1810,2000,maybe
...
另一个文本文件(F2)有大约10K行,并且没有订购。我需要遍历F2并找到它所属的行,从该行获取第3个元素(是,否或可能)并将其附加到F2。例如,如果F2 = [1402,1100,1900],则更新的F2将是:
1402,no
1100,yes
1900,maybe
除了蛮力方法之外,还有更优雅的方式来接近这个吗?我想在F1中找到第一个元素大于或等于我们正在使用的F2中的元素,然后运行余数的搜索(或二元搜索)。任何提示都将不胜感激。
答案 0 :(得分:0)
如果F1中的总范围足够小,例如如果max(2nd column in F1) - min(1st column in F1)
只有几百万个项目,那么您只需将所有内容存储在一个列表中:
class StringCache(dict):
def __missing__(self, key):
return key
f1_list = [None] * NUMBER_OF_ITEMS
string_cache = StringCache()
with open('F1.csv') as f1:
for col1, col2, col3 in csv.reader(f1):
for index in xrange(int(col1), int(col2) + 1):
f1_list[index] = string_cache[col3]
with open('F2.csv') as f2:
for (col,) in csv.reader(f2):
print(f1_list[int(col)])
另请参阅https://stackoverflow.com/a/4544699/416224了解自动增长列表。