如何使用 python 评估文本文件中的数字列表
How to evaluate a list of numbers in a text file with python
我想检查文本文件 (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)+"-"+" |")
我想检查这些数字是否在我定义的范围内。如果它们在这些范围内,它应该打印数字并在后面放一个“+”,如果不在这些范围内,则在数字后面放一个“-”。但是不知道为什么不行?! :)
我什至试图理解这个link“Comparing numbers in a text file to a list of numbers in an other textfile”中讨论的内容
但是什么也没得到。
当您从文件中读取某些内容或 sys.stdin
时,Python 将其作为字符串对象进行威胁。您应该从字符串创建一个 int
对象,最简单的方法是将整个字符串列表转换为整数列表:
P = map(int, line.split())
通过这种方式,您可以将函数 int
应用于 line.split()
(这是一个列表)中的每个对象,并将结果(整数列表)放入 P
中。
P
是每一行中数字的列表,并且 i
随着循环的进行依次获取每个值,因此无需尝试在内部拆分 i
内循环。这样做会将 i
绑定到列表 [P]
,然后您的检查将尝试将该列表查找为 range()
表达式的元素。
根据 Peter wood 评论中的建议,在给定的上限和下限之间进行比较之前,您还应该将字符串 P
转换为整数形式。
我建议采用以下解决方案:我们从文件中获取所有整数(一次获取,如果不是很大则不是问题)并使用辅助函数来检查某个数字是否在给定集合的任何范围内表示范围的元组。
>>> 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-|
在不打开文件的情况下修改您的程序
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 + '|')
输出:
|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-|
我想检查文本文件 (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)+"-"+" |")
我想检查这些数字是否在我定义的范围内。如果它们在这些范围内,它应该打印数字并在后面放一个“+”,如果不在这些范围内,则在数字后面放一个“-”。但是不知道为什么不行?! :) 我什至试图理解这个link“Comparing numbers in a text file to a list of numbers in an other textfile”中讨论的内容 但是什么也没得到。
当您从文件中读取某些内容或 sys.stdin
时,Python 将其作为字符串对象进行威胁。您应该从字符串创建一个 int
对象,最简单的方法是将整个字符串列表转换为整数列表:
P = map(int, line.split())
通过这种方式,您可以将函数 int
应用于 line.split()
(这是一个列表)中的每个对象,并将结果(整数列表)放入 P
中。
P
是每一行中数字的列表,并且 i
随着循环的进行依次获取每个值,因此无需尝试在内部拆分 i
内循环。这样做会将 i
绑定到列表 [P]
,然后您的检查将尝试将该列表查找为 range()
表达式的元素。
根据 Peter wood 评论中的建议,在给定的上限和下限之间进行比较之前,您还应该将字符串 P
转换为整数形式。
我建议采用以下解决方案:我们从文件中获取所有整数(一次获取,如果不是很大则不是问题)并使用辅助函数来检查某个数字是否在给定集合的任何范围内表示范围的元组。
>>> 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-|
在不打开文件的情况下修改您的程序
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 + '|')
输出:
|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-|