2017-04-03 114 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,...)表格的元组的情况。