Python 如何在不使用任何for循环的情况下查找整数是否位于文件的前两列之间
我有一个文件,前两列有整数。 文件名:File.txtPython 如何在不使用任何for循环的情况下查找整数是否位于文件的前两列之间,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有一个文件,前两列有整数。 文件名:File.txt col_a,col_b 1001021,1010045 2001021,2010045 3001021,3010045 4001021,4010045 and so on 现在使用python,我得到一个变量var_a=2002000 现在,如何在“file.txt”中找到该变量所在的范围 我试过用下面的 With open("file.txt","r") as a: a_line = a.readlines() for
col_a,col_b
1001021,1010045
2001021,2010045
3001021,3010045
4001021,4010045 and so on
现在使用python,我得到一个变量var_a=2002000
现在,如何在“file.txt”中找到该变量所在的范围
我试过用下面的
With open("file.txt","r") as a:
a_line = a.readlines()
for line in a_line:
line_sp = line.split(',')
if var_a < line_sp[0] and var_a > line_sp[1]:
print ('%r, %r', %(line_sp[0], line_sp[1])
打开(“file.txt”,“r”)作为一个:
a_line=a.readlines()
对于_行中的行:
line_sp=line.split(',')
如果var_aline_sp[1]:
打印(“%r,%r',%(第\u sp[0]行,第\u sp[1]行)
由于该文件有超过百万条记录,这会很耗时。有没有更好的方法不用for循环就可以做到这一点。假设文件中的每一行都有正确的格式,您可以执行以下操作
var_a = 2002000
with open("file.txt") as file:
for l in file:
a,b = map(int, l.split(',', 1)) # each line must have only two comma separated numbers
if a < var_a < b:
print(l) # use the line as you want
break # if you need only the first occurrence, break the loop now
var_a=2002000
打开(“file.txt”)作为文件:
对于文件中的l:
a、 b=map(int,l.split(',',1))#每行只能有两个逗号分隔的数字
如果a
请注意,如果文件格式不保证,则必须进行额外的验证/解决方法
显然,您必须遍历所有行(在更糟糕的情况下)。但我们不会立即将所有行加载到内存中。因此,一旦找到答案,将忽略文件的其余部分而不进行读取(假设您只查找第一个匹配项).假设文件中的每一行都有正确的格式,您可以执行以下操作
var_a = 2002000
with open("file.txt") as file:
for l in file:
a,b = map(int, l.split(',', 1)) # each line must have only two comma separated numbers
if a < var_a < b:
print(l) # use the line as you want
break # if you need only the first occurrence, break the loop now
var_a=2002000
打开(“file.txt”)作为文件:
对于文件中的l:
a、 b=map(int,l.split(',',1))#每行只能有两个逗号分隔的数字
如果a
请注意,如果文件格式不保证,则必须进行额外的验证/解决方法
显然,您必须遍历所有行(在更糟糕的情况下)。但我们不会立即将所有行加载到内存中。因此,一旦找到答案,文件的其余部分将被忽略而不读取(假设您只查找第一个匹配项)
因为这个文件有超过百万条记录,所以这是时间
消费。有没有更好的方法在没有for循环的情况下实现同样的功能
不幸的是,您必须对文件中的所有记录进行迭代,而归档的唯一方法是某种for
循环。所以此任务的复杂性始终至少为O(n)
因为这个文件有超过百万条记录,所以这是时间
消费。有没有更好的方法在没有for循环的情况下实现同样的功能
不幸的是,您必须对文件中的所有记录进行迭代,而归档的唯一方法是对循环执行某种类型的
。因此此任务的复杂性始终至少为O(n)。最好逐行读取您的文件(而不是全部读取到内存中)并将其内容存储在范围内
以查找多个数字。范围存储效率很高,您只需在文件中读取一次即可检查多个数字
由于Python3.7词典是按插入顺序排列的,因此如果对文件进行排序,则只会迭代词典,直到第一次某个数字在该范围内,而不是所有在该范围内的数字都会迭代整个词典
创建文件:
fn = "n.txt"
with open(fn, "w") as f:
f.write("""1001021,1010045
2001021,2010045
3001021,3010045
garbage
4001021,4010045""")
进程文件:
fn = "n.txt"
# read in
data = {}
with open(fn) as f:
for nr,line in enumerate(f):
line = line.strip()
if line:
try:
start,stop = map(int, line.split(","))
data[nr] = range(start,stop+1)
except ValueError as e:
pass # print(f"Bad data ({e}) in line {nr}")
look_for_nums = [800, 1001021, 3001039, 4010043, 9999999]
for look_for in look_for_nums:
items_checked = 0
for nr,rng in data.items():
items_checked += 1
if look_for in rng:
print(f"Found {look_for} it in line {nr} in range: {rng.start},{rng.stop-1}", end=" ")
break
else:
print(f"{look_for} not found")
print(f"after {items_checked } checks")
输出:
800 not found after 4 checks
Found 1001021 it in line 0 in range: 1001021,1010045 after 1 checks
Found 3001039 it in line 2 in range: 3001021,3010045 after 3 checks
Found 4010043 it in line 5 in range: 4001021,4010045 after 4 checks
9999999 not found after 4 checks
有更好的方法来存储这样一个范围文件,例如,在一个树状数据结构中——如果需要的话,可以通过研究来获得更快的结果。它们以更智能的方式划分范围,因此您不需要使用线性搜索来找到正确的存储桶
这将提供更多的研究内容。最好逐行读取文件(而不是全部存储到内存中),并将其内容存储在范围内,以查找多个数字。范围存储效率相当高,您只需在文件中读取一次,即可检查多个数字
由于Python3.7词典是按插入顺序排列的,因此如果对文件进行排序,则只会迭代词典,直到第一次某个数字在该范围内,而不是所有在该范围内的数字都会迭代整个词典
创建文件:
fn = "n.txt"
with open(fn, "w") as f:
f.write("""1001021,1010045
2001021,2010045
3001021,3010045
garbage
4001021,4010045""")
进程文件:
fn = "n.txt"
# read in
data = {}
with open(fn) as f:
for nr,line in enumerate(f):
line = line.strip()
if line:
try:
start,stop = map(int, line.split(","))
data[nr] = range(start,stop+1)
except ValueError as e:
pass # print(f"Bad data ({e}) in line {nr}")
look_for_nums = [800, 1001021, 3001039, 4010043, 9999999]
for look_for in look_for_nums:
items_checked = 0
for nr,rng in data.items():
items_checked += 1
if look_for in rng:
print(f"Found {look_for} it in line {nr} in range: {rng.start},{rng.stop-1}", end=" ")
break
else:
print(f"{look_for} not found")
print(f"after {items_checked } checks")
输出:
800 not found after 4 checks
Found 1001021 it in line 0 in range: 1001021,1010045 after 1 checks
Found 3001039 it in line 2 in range: 3001021,3010045 after 3 checks
Found 4010043 it in line 5 in range: 4001021,4010045 after 4 checks
9999999 not found after 4 checks
有更好的方法来存储这样一个范围文件,例如,在一个树状数据结构中——如果需要的话,可以通过研究来获得更快的结果。它们以更智能的方式划分范围,因此您不需要使用线性搜索来找到正确的存储桶
此to提供了更多需要研究的内容。不,没有办法避免在文件行中循环。如果值按升序排列,您可以在遇到一个比您要查找的值大的值时,将其从循环中分离出来。如果未对其进行排序,则可能值得先对其进行排序(因为您正在将整个文件读入内存)。我建议为此使用一个专门的库,如csv或Pandas。不,没有办法避免在文件行中循环。如果值按升序排列,您可以在遇到比您要查找的值更大的值时将其从循环中打断。如果未对其进行排序,则可能值得对其进行排序irst(因为您正在将整个文件读取到内存中)。我建议为此使用专门的库,如csv或Pandas。感谢您的回复。给出一些不同的观点。将检查并批准答案。感谢您的回复。给出一些不同的观点。将检查并批准答案。