2012-11-04 25 views
1

我知道這是一個非常基本的問題,但我也是Python環境中的新手。我正在寫我的第一個程序(數據結構問題),我需要閱讀一些輸入測試用例。在python中編寫代碼以從「txt」文件讀取一些示例輸入的最佳方式是什麼?

輸入:

The first line contains the number of test cases T. T test cases follow. 
The first line for each case contains N, the number of elements to be sorted. 
The next line contains N integers a[1],a[2]...,a[N]. 

約束:

1 <= T <= 5 
1 <= N <= 100000 
1 <= a[i] <= 1000000 

樣品輸入:

2 
5 
1 1 1 2 2 
5 
2 1 3 1 2 

我寫了下面的程序,以從文件中讀取上面的輸入,但我敢肯定,這不是最好的辦法,因爲它包含很多if-else循環和for循環,這將真的吸大inputs

sample = open('sample.txt') 
first = sample.readline() 
if len(first) > 5 or len(first) <1: 
    print "Not correct input"; 
else: 
    test = sample.readline 
    for x in range(0,len(first)): 
     second = sample.readline() 
     if len(second) >100000 or len(second) < 1: 
      print "wrong input"; 
     else: 
      third = list() 
      for y in range(0, len(third)): 
       third.append(sample.readline()[:1]) 
     method_test(third) #calling a method for each sample input 

請給我最好的解決方案。

+0

你到底想幹什麼?看起來你已經把閱讀部分放下了,你想限制輸入嗎?此外,它看起來像這兩個「如果」總是會失敗(不可能同時滿足兩者和條件)。也就是說,他們永遠不會打印「不正確的輸入」/「錯誤的輸入」。 – CrazyCasta

+0

其實我只是想獲得通用的解決方案,從每個約束文件讀取示例輸入。 –

+0

'如果len(first)> 5和len(first)<1''沒有意義。你可能是指''或''? – codeape

回答

3

這應做到:

with open('sample.txt') as sample: 
    num_testcases = int(sample.readline()) 
    assert 1 <= num_testcases <= 5 
    for testcase in range(num_testcases): 
     num_elems = int(sample.readline()) 
     assert 1 <= num_elems <= 10000 
     elems = map(int, sample.readline().split()) 
     assert len(elems) == num_elems 
     assert all(1 <= elem <= 100000 for elem in elems) 
     method_test(elems) 

編輯:增加有效性檢查。

+0

非常簡潔,並且很好的指出,甚至沒有使用元素的數量。也許你應該添加一些關於你使用'int'和'len'的文本來使它成爲完整的包?我認爲你也沒有檢查元素的操作界限。 – jdi

+0

我可能會添加一個'assert len(elems)== num_elems'但是好的答案 –

+0

我應該如何檢查約束?我的意思是第三個約束? –

1

首先, len(x)會告訴你輸入的長度,所以如果你的輸入線是「9」,len(line)將是1;如果您的輸入行是「999」,則len(line)將是3.您需要使用int(line)正確地從輸入文件讀取一個數字。

程序其餘部分的邏輯看起來不正確 - 例如,您正在閱讀第一行(測試次數)和循環此數字(這很好) - 但您正在閱讀以外的值此循環,這是錯誤的順序。

我強烈建議您在閱讀時打印出不同的值,以便您可以關注正在進行的操作並更輕鬆地調試程序。

最後,當你做到以下幾點:

要創建一個空的列表list()然後從0循環到列表的長度(這也是零)。所以循環實際上不會做任何事情。

+0

感謝您回答@DNA,但是您可能會寫出解決方案。所以我可以理解它 –

+1

不,對不起 - 您需要自己完成這項工作才能從中學習。儘管我會在答覆中加入更多的指針。 – DNA

+0

感謝您指出錯誤 –

1

像這樣:

使用cycle()的第一行之後,只讀僅交替行,和週期的大小將是T值的兩倍。

from itertools import islice,cycle 
with open("data1.txt") as f: 
    T = int(f.readline()) 
    if T != 0: 
      cyc=islice(cycle((False,True)),T*2) 
      for x in cyc: 
       if x or not f.readline(): 
        print map(int,f.readline().split()) 

輸出:

[1, 1, 1, 2, 2] 
[2, 1, 3, 1, 2] 
+1

從一個新手,恕我直言,非常基本的問題答案太複雜。無論如何,[早期優化是所有邪惡的根源](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)。 ;-) – martineau

相關問題