2015-04-19 139 views
3

我有一個文本文件,它看起來像這樣:字符串列表

3 & 221/73 \\\ 
4 & 963/73 \\\ 
5 & 732/65 \\\ 
6 & 1106/59 \\\ 
7 & 647/29 \\\ 
8 & 1747/49 \\\ 
9 & 1923/49 \\\ 
10 & 1601/41 \\\ 
6 & 512 \\\ 

我想的對數加載到一個列表或字典。

這是我的代碼至今:

L = [] 
data1 = data.replace (" \\\\", " ") 
data2 = data1.replace(" & "," ") 
i=0 
a='' 
b='' 
while data2[i] != None: 
    if(a==''): 
     while(data2[i] != ''): 
      a=a+data2[i] 
      i = i + 1 
     while(data2[i] !=''): 
      b=b+data2[i] 
      i = i + 1 
    L.append((int(a),int(b))) 
    a='' 
    b='' 
    i=i+1 

但是,這是錯誤我得到:

"while(data2[i] != ''): string out of range" 
+4

我想你是從C背景! Python中沒有字符串不會以'None'結尾。沒有無字符。你在Python中以字符串的形式運行循環:'for string_var中的c_var:'不在循環中使用'c_var' –

+0

你的代碼的輸出應該是什麼樣的? – ZdaR

+0

@GrijeshChauhan你對C背景是正確的。 – Lior

回答

1

這裏是一個解決方案就是有點類似C的少,看起來更像蟒蛇。而不知道究竟的輸出應該看起來像,第一猜測導致我這樣的解決方案:

result = [] 

with open("test.txt") as f: 
    lines = f.readlines() 
    for l in lines: 
      l = l.replace('\\', '') 
      elements = l.split("&") 
      elements = [x.strip() for x in elements] 
      result.append((int(elements[0]), elements[1])) 

print result 

這是輸出:

[(3, '221/73'), (4, '963/73'), (5, '732/65'), (6, '1106/59'), (7, '647/29'), (8, '1747/49'), (9, '1923/49'), (10, '1601/41'), (6, '512')] 

注意,這是缺少錯誤處理,所以如果文件不符合你的格式,這可能會引發異常。

+0

謝謝,但仍然有一個錯誤 > result [int(elements [Integer(0)]) ] =元素[Integer(1)] > IndexError:列表索引超出範圍 – Lior

0

我想你想用i < len(data2)這樣的東西代替data2[i] != ''data2[i] != None:

此外,您的代碼將在該行上失敗L.append((int(a),int(b))),因爲221/73不是有效的文字。

2

你差不多已經有了,就像提到@Vor一樣,你的條件陳述就是問題所在。文本文件不以Python中的None結尾,因此您不能執行data2[i] != ''data2[i] != None:

with open("data.txt") as f: 
    L=[] 
    for line in f: 
     line=line.replace(" \\\\\\", "").strip() #Replace \\\ and strip newlines 
     a,b=line.split(' & ')     #Split the 2 numbers 
     L.append((int(a),b))      #Append as a tuple 

這種方法會輸出一個元組列表,你問:

>>> L 
[(3, '221/73'), (4, '963/73'), (5, '732/65'), (6, '1106/59'), (7, '647/29'), (8, '1747/49'), (9, '1923/49'), (10, '1601/41'), (6, '512')] 

注:在你的第三個最後一行,當你追加到L,您在b使用int()變量。由於該字符串的格式爲'221/73',因此它不是有效的整數。你可以將字符串和int()分開,但是它會將數字分開,這可能不是你想要的。

+0

有一個錯誤: ValueError:需要多個值才能在 中解壓a,b = line.split('&') – Lior

+1

@ Lior在像這樣的字符串上使用split('&')''3&221/73「'時,有兩個值可以解壓縮,'3'和'221/73'。你確定你的文本文件格式正確嗎? – logic

+1

@Lior:只有當數據行(反斜槓刪除後)與'string1&string2'格式不匹配時,纔會出現該錯誤消息。 –