2014-12-19 142 views
2

我正在进行CodeEval挑战并解决了以数字列表作为输入的问题,然后输出每行数字的总和。这里是我的代码,使某些你明白我的意思:从字符串中删除第一个字符

import sys 
test_cases = open(sys.argv[1], 'r') 
for test in test_cases: 
    if test: 
     num = int(test) 
     total =0 
     while num != 0: 
      total += num % 10 
      num /= 10 
     print total 


test_cases.close() 

我试图改写这个地方花费数作为一个字符串,切片各为0指数,然后将这些在一起(好奇,想看看什么时间和内存的差别是 - 全新的编码,并试图找到多种方式做的事情为好)

不过,我被困在得到这个执行并具备以下条件:

import sys 
test_cases = open(sys.argv[1], 'r') 
for test in test_cases: 
    sums = 0 
    while test: 
     sums = sums + int(str(test)[0]) 
     test = test[1:] 
    print sums 

test_cases.close() 

我收到一个“ValueError:无效文字int()与基地10:“””

样品输入是一个文本文件,它看起来像这样:

3011 
6890 
8778 
1844 
42 
8849 
3847 
8985 
5048 
7350 
8121 
5421 
7026 
4246 
4439 
6993 
4761 
3658 
6049 
1177 

感谢您可以提供任何帮助!

+1

而不是让一个字符,并创造新的没有第一个字符的字符串,你可以迭代字符串来处理char字符后的字符。它更有效率。我的意思是:'对于测试中的char:sum + = int(char)'而不是'while test:...'。 – GingerPlusPlus

+0

谢谢,我也会试一试。 – Abraxas

回答

3

你的问题是每行结尾处的换行符(例如./n或/ r/n)。

改变这一行:

for test in test_cases: 

这个分裂出来的新行:

for test in test_cases.read().splitlines(): 
+0

太棒了,就是这样!非常感谢。 – Abraxas

0

试试这个代码:使用上下文管理

tot = 0 
with open(sys.argv[1], 'r') as f: 
    for line in f: 
     try: 
      tot += int(line) 
     except ValueError: 
      print "Not a number" 

print tot 
  • with...)该文件将自动关闭d。
  • 铸造int过滤任何空的或无效的值

可以替代print与任何其他说法最适合你(raisepass取决于你的目标)

相关问题