2016-03-28 1 views
-6

je suis nouveau à python Je dictionnaire Ordonnéformulaire Python une liste basée à partir des valeurs dans le dictionnaire

dictA = {f1 : ["s","r"], 
     f2 : ["p"], 
     f3 : ["w","t"]} 

Comment je former une liste qui devrait avoir seulement 1er éléments de valeurs présentes dans dicta dictionnaire et suivi de 2e éléments ... et ainsi de suite, jusqu'à ce qu'elle atteigne la list_size_limit = 5

Final list ["s","p","w","r","t"] 

si le list_size_limit = 3

Final list = ["s","p","w"] 

Comment puis-je former une liste qui a 1er éléments de toutes les valeurs de dictionnaire pour être présents dans la 1ère liste, suivie 2e éléments ... 3e éléments

+3

Qu'avez-vous essayé, et quel est le problème précisément avec elle? Notez que vous ne pouvez pas garantir l'ordre de sortie des valeurs d'un dictionnaire, il n'est pas clair si vous en avez besoin. – jonrsharpe

+0

Il y a un problème inhérent à cette question. Les dictionnaires ne sont pas ordonnés sur leurs clés, donc 'list' avec' list_size_limit == 3' pourrait être n'importe quelle permutation de '{" s "," p "," w "}'. ['OrderedDict'] (https://docs.python.org/3/library/collections.html#collections.OrderedDict) peut aider avec cela au moins. – Kupiakos

+0

J'ai Orderdict() dictA est commandé – FryMan

Répondre

0
dictA = {"f1" : ["m"], 
     "f2" : ["p","y","o","a","s","d","f","g"], 
     "f3" : ["w","t"], 
     "f5" : ["z","x"], 
     "f6" : ["c","v"]} 

result = [] 
limit_size = 3 
values_list = [] 
for values in dictA.itervalues(): 
    values_list.append(len(values)) 

for i in range(0,max(values_list)): 
    keys = list(dictA.keys()) 
    count = 0 
    while count < len(keys): 
     try: 
      result.append(dictA[keys[count]][i]) 
     except IndexError: 
      dictA.pop(keys[count]) 
     count = count + 1 
print "final ",result[0:limit_size] 
2

Honnêtement pas sûr comment appeler cette fonction. Nommer les choses est difficile.

def getFirstOfDictList(d, limit=None): 
    if limit is None: 
     limit = float('inf') 
    done = 0 
    iters = [iter(i) for i in d.values()] 
    items = [] 
    while iters: 
     toRemove = [] 
     for iterator in iters: 
      if done >= limit: 
       return items 
      try: 
       items.append(next(iterator)) 
       done += 1 
      except StopIteration: 
       toRemove.append(iterator) 
     for finishedIterator in toRemove: 
      iters.remove(finishedIterator) 
    return items 
+0

une autre façon de résoudre? Sans créer d'objet iter – FryMan