如何使用python计算文本文件中的数字列表

如何使用python计算文本文件中的数字列表,python,numbers,range,Python,Numbers,Range,我想用下面的示例格式检查文本文件(P1.txt)中的数字列表: 68278 63989 64283 65917 66503 68794 68299 64827 65294 68783 68857 68459 66552 63053 66588 68162 67316 66742 65008 64327 65320 68307 65798 65198 67868 67157 63526 63917 我试着用我写的代码来实现它,如下所示: with open("P1.txt") as fin, op

我想用下面的示例格式检查文本文件(P1.txt)中的数字列表:

68278 63989 64283 65917 66503 68794 68299 64827 65294 68783 68857 68459 66552 63053 66588 68162 67316 66742 65008 64327 65320 68307 65798 65198 67868 67157 63526 63917

我试着用我写的代码来实现它,如下所示:

with open("P1.txt") as fin, open("P1_c.txt","w") as fout:
 for line in fin:
  P = line.split()
  for i in P:
    i=P.split()
    if i in range(64600,64799) :
        fout.write("|"+str(P)+"+"+" |")
    elif i in range(67000,67319) :
        fout.write("|"+str(P)+"+"+" |")
    elif i in range(67399,67600) :
        fout.write("|"+str(P)+"+"+" |")
    elif i in range(68000,68699) :
        fout.write("|"+str(P)+"+"+" |")
    elif i in range(69400,69599) :
        fout.write("|"+str(P)+"+"+" |")
    else:
        fout.write("|"+str(P)+"-"+" |")
我想检查这些数字是否在我定义的范围内。如果它们在这些范围内,则应打印数字并在后面加“+”,如果不在这些范围内,则在数字后面加“-”。但我不知道为什么它不起作用?!:) 我甚至试图理解此链接中讨论的内容“”
但是没有得到任何东西。

当您从文件或
sys.stdin
中读取某些内容时,Python会将其作为字符串对象进行威胁。您应该从字符串创建
int
对象,最简单的方法是将整个字符串列表转换为int列表:

 P = map(int, line.split())

通过这种方式,您可以将函数
int
应用于
行中的每个对象。split()
(这是一个列表),并将结果(一个int列表)放入
p
p
是每行中的数字列表,并且
i
随着循环的进行依次接收每个值,因此,无需尝试在内部循环中拆分
i
。这样做会将
i
绑定到列表
[P]
,然后您的检查将尝试将该列表作为
范围()
表达式的一个元素查找


根据Peter wood评论中的建议,在比较给定的上限和下限之前,您还应该将字符串
p
转换为整数形式。

我建议以下解决方案:我们从文件中获取所有整数(如果不是巨大的,一次就没有问题)并使用一个helper函数,该函数检查一个数字是否在指示该范围的给定元组集合的任何范围内

>>> def in_ranges(x, range_tuples):
...     return any(t[0] <= x < t[1] for t in range_tuples)
>>>
>>> range_tuples = [(64600,64799), (67000,67319), (67399,67600),
...                 (68000,68699), (69400,69599)]
>>>
>>> with open('testfile') as f:
...     for number in map(int, f.read().split()):
...         if in_ranges(number, range_tuples):
...             sign = '+'
...         else:
...             sign = '-'
...         print '|{}{}|'.format(number, sign)
... 
|68278+|
|63989-|
|64283-|
|65917-|
|66503-|
|68794-|
|68299+|
|64827-|
|65294-|
|68783-|
|68857-|
|68459+|
|66552-|
|63053-|
|66588-|
|68162+|
|67316+|
|66742-|
|65008-|
|64327-|
|65320-|
|68307+|
|65798-|
|65198-|
|67868-|
|67157+|
|63526-|
|63917-|
>>定义范围(x,范围元组):
...     返回任何(t[0]>>
>>>range_tuples=[(6460064799),(6700067319),(6739967600),
...                 (68000,68699), (69400,69599)]
>>>
>>>将open('testfile')作为f:
…对于映射中的数字(int,f.read().split()):
…如果在\u范围内(数量、范围\u元组):
…符号='+'
……其他:
…符号='-'
…打印“|{}{}|”。格式(数字、符号)
... 
|68278+|
|63989-|
|64283-|
|65917-|
|66503-|
|68794-|
|68299+|
|64827-|
|65294-|
|68783-|
|68857-|
|68459+|
|66552-|
|63053-|
|66588-|
|68162+|
|67316+|
|66742-|
|65008-|
|64327-|
|65320-|
|68307+|
|65798-|
|65198-|
|67868-|
|67157+|
|63526-|
|63917-|

在不打开文件的情况下重新编写程序

testlines = [
    '68278 63989 64283 65917 66503 68794 68299 64827 65294 68783 68857 68459 66552 63053',
    '66588 68162 67316 66742 65008 64327 65320 68307 65798 65198 67868 67157 63526 63917'
]


ranges = [(64600, 64799), (67000, 67319), (67399, 67600),
          (68000, 68699), (69400, 69599)]

for a in testlines:

    for num in (int(x) for x in a.split()):

        suffix = '-'
        for lo, hi in ranges:
            if lo <= num < hi:
                suffix = '+'
                break

        print('|' + str(num) + suffix + '|')

在进行比较之前,将i转换为int,它仍然是一个字符串:
int(i)
此外,除非您使用的是Python 3,否则范围是创建和检查包含的费用。如果64600
i=P.split()
很奇怪,请使用
。您认为它在做什么?