2010-10-20 5 views
3

Je suis liste des tuple comme:tuple dans la liste pour trouver des valeurs

mylist = [ (user1, 23, 32), (user1, 23, 34), (user3, 34, 34), (user2, 34, 45), (user1, 45,23),(user2, 56, 56), (user5, 4,4)] 

J'ai besoin de trouver le temps moyen pour chaque utilisateur. Mon problème est que je ne connais pas le nombre d'utilisateurs et les valeurs. donc je ne peux pas faire

for item in mylist: 
    if item[0] == 'user1': 
     new_list.append((item1, item2)) 

Comment obtenir des valeurs

aime
user1 = [ (23,32), (23,34), (45,23)] 
user2 = [(34, 45), (56,56)] 
usre3 = [(34,34)] 

grâce

Répondre

4
>>> from collections import defaultdict  
>>> d = defaultdict(list) 
>>> for user, *items in mylist: 
    d[user] += items, 


>>> d 
defaultdict(<class 'list'>, {'user5': [[4, 4]], 'user2': [[34, 45], [56, 56]], 'user3': [[34, 34]], 'user1': [[23, 32], [23, 34], [45, 23]]}) 
+0

Ah, séquence un emballage ... génie! +1 – delnan

+0

+1 Je n'ai jamais vu de déballage de séquence dans une boucle for! – rubik

+0

pour python 3. *, vous obtiendrez une erreur de syntaxe dans python 2. * – mouad

2

Vous avez évidemment besoin d'un dictionnaire, non? Une approche serait comme:

results = {} 
for user, val1, val2 in mylist: 
    if user not in results: 
     results[user] = [] 
    results[user].append((val1, val2)) 

Mais grâce à collections.defaultdict (de 2,5 à compter), nous pouvons simplifier:

import collections 

results = collections.defaultdict(list) 
for users, val1, val2 in mylist: 
    results[user].append((val1, val2)) 
+0

grâce une assistance précieuse pour 2,5 .. – laspal

0

Je devine que vous avez fait une liste comme ceci:

mylist = [ ('user1', 23, 32), ('user1', 23, 34), ('user3', 34, 34), ('user2', 34, 45), ('user1', 45,23), ('user2', 56, 56), ('user5', 4,4)] 

vous ne voulez pas faire une nouvelle liste, vous voulez un dictionnaire:

from collections import defaultdict 

users = defaultdict(list) 
for u, t1, t2 in mylist: 
    users[u].append((t1, t2)) 

Ensuite, vous pouvez, par exemple:

print users['user1'] 

produit:

[(23, 32), (23, 34), (45, 23)] 
0

Utilisez un dictionnaire:

avgtimes = {} 
for item in mylist: 
    avgtimes.setdefault(item[0], []).append(item[1:]) 
0
from collections import defaultdict 
h=defaultdict(list) 
mylist = [ ("user1", 23, 32), ("user1", 23, 34), ("user3", 34, 34), ("user2", 34, 45), ("user1", 45,23),("user2", 56, 56), ("user5", 4,4)] 
for item in mylist: 
    h[item[0]].append(item[1:]) 
print h 
Questions connexes