Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使用任何for循环的情况下查找整数是否位于文件的前两列之间_Python_Python 3.x_Python 2.7 - Fatal编程技术网

Python 如何在不使用任何for循环的情况下查找整数是否位于文件的前两列之间

Python 如何在不使用任何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

我有一个文件,前两列有整数。 文件名: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 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。感谢您的回复。给出一些不同的观点。将检查并批准答案。感谢您的回复。给出一些不同的观点。将检查并批准答案。