2017-04-03 1 views
0

J'écris une fonction pour retourner plusieurs listes (au moins une). Il est ressemble ci-dessous:tuple de retour de fonction. parfois obtenir des listes, parfois obtenir tuple

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) 

Pour le faire, je l'utilise tuple je peux utiliser

list1, list2 = get_stock_atrributes_data() 

à interroger plusieurs attributs des listes déterminées par le attrList. Lorsque je renvoie plusieurs listes (plus d'une), cela fonctionne plutôt bien. Mais si je retourne une seule liste, le résultat est un tuple contenant une liste, par exemple:

list1 = get_stock_atrributes_data() 

Le list1 est un tuple plutôt qu'une liste maintenant. J'ai lu quelques explications sur le renvoi des tuples. On dit que les éléments dans tuple seront déballés et assignés automatiquement. Pour un tuple retourné avec plus d'un élément, cela fonctionne. Mais pour tuple ne contenant qu'un seul élément, le résultat n'est pas décompressé. J'étais confus par ceci et espère que quelqu'un peut me donner l'explication.

Répondre

2

Voici un exemple, vous devriez pouvoir l'utiliser pour modifier votre code et obtenir le résultat que vous recherchez.

def retTup(x): 
    return tuple(x) 

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

Cela donnera:

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

Maintenant, si je fais:

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

je vais obtenir un tuple pour un:

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

Ainsi, au lieu Je récupère ve la liste que: (avis la virgule)

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

Et maintenant:

a = [1,2,3] 

Comme souhaité.

+0

Bonne réponse, mais veuillez mettre l'accent sur la virgule. –

+0

Salut, il a résolu le problème! Pourriez-vous m'aider à expliquer pourquoi une simple virgule résout le problème? – dashenswen

+0

La fonction retourne toujours un tuple, donc si vous êtes réellement intéressé par les éléments d'un tuple, vous devez y accéder directement. Lorsque vous utilisez la virgule, il accède au premier (et seul) élément du tuple. – Robbie

0

La méthode retournera-t-elle seulement 1 élément ou 2 éléments? Ou est-il possible pour la méthode de renvoyer X nombreux éléments?

Vous pouvez essayer de définir le résultat à une variable et puis créer une nouvelle liste de listes:

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

Le + opérateur dans ce cas, effectue l'opération append, mais étant donné que append() n'a pas de valeur de retour, il ne peut pas être utilisé ici.

Cela devrait fonctionner avec le cas dans lequel vous êtes retourné un tuple de la forme (X,) ou le formulaire (X,Y,...).