如何确定文本文件中有多少个奇数和偶数?
How do I determine how many odd and even numbers are in a text file?
def main():
#Open the numbers.txt file
File=open ('numbers.txt', 'r')
#This reads the lines in the file
for line in File:
#Convert line to float
amount=float(line)
#format and display the amount
print(format(amount,'.2f'))
print("\n")
#close the file
File.close()
for amount in range (0,13):
if (amount%2==0):
print amount
main()
输出应该是这样的:
53
15
21
49
8
98
55
21
76
75
53
28
Total of even numbers:[]
Total of odd numbers:[]
如果所有数字都是整数(浮点数没有明确定义的偶数和奇数概念):
import itertools
def odd(i):
return i % 2
def sumoddevens(fn):
with open(fn) as f:
nums[int(s.strip()) for s in f]
nums.sort(key=odd)
results = [0, 0]
for k, g in itertools.groupby(nums, key=odd):
results[k] = sum(g)
return results
returns 一个 2 项列表,首先是偶数之和,然后是奇数之和。如果文件不是太大而无法放入内存,则此方法效果很好;如果文件非常大,则:
results = [0, 0]
with open(fn) as f:
for s in f:
i = int(s.strip())
results[odd(i)] += i
return results
虽然更简洁,但速度较慢,但无论文件大小如何。
补充:有些人可能会对我声称后一个版本 "is slower" 感到惊讶——毕竟它是 O(N) 而前者有一个 sort
因此它是 O(N log N) .
但是,big-O 是关于 "worst case",而不是 典型的 性能。 Python 的 "timsort" 通常快得惊人,因为它充分利用了现实世界数据中常见的任何现有 "partial sortedness"(这个特定的 key
,只产生两个值, 使得更有可能);前一个版本依赖sort
、groupby
、sum
的超级优化内码,而后者则不能。
当然,在某些时候(足够大的文件)以前的版本会受到影响 - 但这很可能是在总和变得如此之大以至于 +
不再是 O(1)
的时候(对足够大的整数求和实际上是 O(log N)
-- 想一想!-),and/or 在数据不能很好地放入内存的点附近。
所以 在实践中,对于 "fit comfortably in memory" 的文件,我在比赛中的钱会花在以前的版本上,无论 big-O 说什么:-)
除非你在 numbers.txt 中确实有浮点数,否则只需转换为 int:
with open("numbers.txt") as f:
odds = []
evens = []
for num in f:
num = int(num)
if num % 2: # if there is a remainder num is odd
odds.append(num)
else: # else it must be even
evens.append(num)
print("All even numbers: {}".format(evens))
print("All odd numbers: {}".format(odds))
print("Total amount of even numbers: {}".format(len(evens))) # len will be total even nums
print("Total amount of odd numbers: {}".format(len(odds)))
如果您只想要计数:
with open("numbers.txt") as f:
odd,even = 0, 0
for num in f:
num = int(num)
if num % 2:
odd += 1
else:
even += 1
print("Total amount of even numbers: {}".format(even))
print("Total amount of odd numbers: {}".format(odd))
def even_numbers(file_name):
with open(file_name) as f:
even_numbers = []
for line in f:
line = line.strip()
if line.isdigit():
if int(line) % 2 == 0:
print(line)
even_numbers('hello.txt')
def main():
#Open the numbers.txt file
File=open ('numbers.txt', 'r')
#This reads the lines in the file
for line in File:
#Convert line to float
amount=float(line)
#format and display the amount
print(format(amount,'.2f'))
print("\n")
#close the file
File.close()
for amount in range (0,13):
if (amount%2==0):
print amount
main()
输出应该是这样的:
53
15
21
49
8
98
55
21
76
75
53
28
Total of even numbers:[]
Total of odd numbers:[]
如果所有数字都是整数(浮点数没有明确定义的偶数和奇数概念):
import itertools
def odd(i):
return i % 2
def sumoddevens(fn):
with open(fn) as f:
nums[int(s.strip()) for s in f]
nums.sort(key=odd)
results = [0, 0]
for k, g in itertools.groupby(nums, key=odd):
results[k] = sum(g)
return results
returns 一个 2 项列表,首先是偶数之和,然后是奇数之和。如果文件不是太大而无法放入内存,则此方法效果很好;如果文件非常大,则:
results = [0, 0]
with open(fn) as f:
for s in f:
i = int(s.strip())
results[odd(i)] += i
return results
虽然更简洁,但速度较慢,但无论文件大小如何。
补充:有些人可能会对我声称后一个版本 "is slower" 感到惊讶——毕竟它是 O(N) 而前者有一个 sort
因此它是 O(N log N) .
但是,big-O 是关于 "worst case",而不是 典型的 性能。 Python 的 "timsort" 通常快得惊人,因为它充分利用了现实世界数据中常见的任何现有 "partial sortedness"(这个特定的 key
,只产生两个值, 使得更有可能);前一个版本依赖sort
、groupby
、sum
的超级优化内码,而后者则不能。
当然,在某些时候(足够大的文件)以前的版本会受到影响 - 但这很可能是在总和变得如此之大以至于 +
不再是 O(1)
的时候(对足够大的整数求和实际上是 O(log N)
-- 想一想!-),and/or 在数据不能很好地放入内存的点附近。
所以 在实践中,对于 "fit comfortably in memory" 的文件,我在比赛中的钱会花在以前的版本上,无论 big-O 说什么:-)
除非你在 numbers.txt 中确实有浮点数,否则只需转换为 int:
with open("numbers.txt") as f:
odds = []
evens = []
for num in f:
num = int(num)
if num % 2: # if there is a remainder num is odd
odds.append(num)
else: # else it must be even
evens.append(num)
print("All even numbers: {}".format(evens))
print("All odd numbers: {}".format(odds))
print("Total amount of even numbers: {}".format(len(evens))) # len will be total even nums
print("Total amount of odd numbers: {}".format(len(odds)))
如果您只想要计数:
with open("numbers.txt") as f:
odd,even = 0, 0
for num in f:
num = int(num)
if num % 2:
odd += 1
else:
even += 1
print("Total amount of even numbers: {}".format(even))
print("Total amount of odd numbers: {}".format(odd))
def even_numbers(file_name):
with open(file_name) as f:
even_numbers = []
for line in f:
line = line.strip()
if line.isdigit():
if int(line) % 2 == 0:
print(line)
even_numbers('hello.txt')