2017-04-03 44 views
0

我寫一個函數返回多個列表(至少一個)。它看起來象下面這樣:函數返回元組。有時會得到列表,有時會得到元組

def get_stock_atrributes_data(stock, attrList): 
    dbClient = MongoClient() 
    db = dbClient.StockAnnual 
    #only query the data we need 
    query = {attr: 1 for attr in attrList} 
    #exclude id 
    query['_id'] = 0 
    cursor = db[stock].find({}, query).sort([('date', pymongo.ASCENDING)]) 
    #tranform cursor to list so it becomes iterative 
    l = list(cursor) 
    res = [] 
    for attr in attrList: 
     res.append([d[attr] for d in l]) 
    return tuple(res) 

爲了做到這一點,我使用的元組,所以我可以用

list1, list2 = get_stock_atrributes_data() 

查詢由attrList確定多個屬性列表。當我返回多個列表(多於一個)時,它工作得很好。但是,如果我只返回一個列表,其結果是包含一個列表中的元組,例如:

list1 = get_stock_atrributes_data() 

list1是一個元組,而不是一個列表了。我讀了一些關於返回元組的解釋。據說元組中的元素將被自動解包和分配。對於具有多個元素的返回元組,它可以工作。但是對於只包含一個元素的元組,結果不會被解壓縮。我很困惑,希望有人能給我解釋。

回答

2

下面是一個例子,你應該可以使用它來修改你的代碼並獲得你想要的結果。

def retTup(x): 
    return tuple(x) 

a,b = retTup([[1,2,3],[4,5,6]]) 

這將給:

a = [1,2,3] 
b = [4,5,6] 

現在,如果我做的:

a = retTup([[1,2,3]]) 

我會得到一個一個元組:

a = ([1,2,3],) 

所以不是我檢索已經在名單爲:(通知逗號

a, = retTup([[1,2,3]]) 

現在:

a = [1,2,3] 

如期望的那樣。

+0

很好的答案,但請強調逗號。 –

+0

嗨,它解決了問題!你能幫我解釋爲什麼一個簡單的逗號可以解決這個問題嗎? – dashenswen

+0

函數總是返回一個元組,所以如果你真的對元組的元素感興趣,你必須直接訪問它們。當您使用逗號時,它會訪問元組的第一個(也是唯一)元素。 – Robbie

0

該方法只返回1個元素或2個元素嗎?或者是否有可能讓方法返回許多元素?

你可以嘗試的結果設置爲一個變量,然後創建列表的新列表:

results = get_stock_attributes_data() 
arranged_results = [] 
arranged_results = [arranged_results + element for element in results] 

在這種情況下,+運算符執行追加操作,但由於append()沒有返回值,它不能在這裏使用。

這應該適用於您返回的形式爲(X,)(X,Y,...)表格的元組的情況。

相關問題