2012-12-23 37 views
0

我完全心慌意亂。我從一個文本文件中創建一個元組列表,並做好了所有的轉換到整數:使用元組和元素時字符串對象不可調用

for line in f: 
    if firstLine is True: #first line of file is the total knapsack size and # of items. 
     knapsackSize, nItems = line.split() 
     firstLine = False 
    else: 
     itemSize, itemValue = line.split() 
     items.append((int(itemSize), int(itemValue))) 
print items 

knapsackSize, nItems = int(knapsackSize), int(nItems) #convert strings to ints 

我有一個訪問元組更可讀的代碼功能:

def itemSize(item): return item[0] 
def itemValue(item): return item[1] 

然而,當我調用這些函數,即,:

elif itemSize(items[nItems-1]) > sizeLimit 

我得到一個莫名其妙的錯誤"'str' object is not callable",引用的代碼前面的行。我使用instsanceof檢查了應該是元組或int的所有內容,並且它全部檢出。是什麼賦予了?

+1

'itemSize,itemValue = line.split()'表示'itemSize'是一個'string'。 –

回答

1

因爲在這一點上:

itemSize, itemValue = line.split() 

itemSize仍然是一個字符串 - 你已經追加到itemsint轉換值...

我也會改變你的邏輯稍微處理第一線:

with open('file') as fin: 
    knapsackSize, nItems = next(fin).split() # take first line 
    for other_lines in fin: # everything after 
     pass # do stuff for rest of file 

或者只是改變一大堆(假設它是一個2列文件的整數)

with open('file') as fin: 
    lines = (map(int, line.split()) for line in fin) 
    knapsackSize, nItems = next(lines) 
    items = list(lines) 

和可能,而不是你的函數返回的項目 - 使用dictnamedtuple ...

或者,如果你想留在功能,然後去operator模塊及用途:

itemSize = operator.itemgetter(0) 
相關問題