2017-05-26 13 views
0

Ich habe eine Reihe von Aktionen, die ich zufällig ausführen möchte. Eine der Aktionen iteriert über ein Wörterbuch. Ich möchte, dass jedes Mal, wenn diese Aktion aufgerufen wird, das Wörterbuch zur nächsten Position des Wörterbuchs und nicht zur ersten iteriert.Speichern der Wörterbuchiterationsposition für die spätere Fortsetzung

Wenn ich nur einen Wert benötigen würde, könnte ich eine Liste anstelle eines Wörterbuchs verwenden, die Indexliste außerhalb des Funktionsaufrufs speichern und den letzten Index der Liste an die Funktion übergeben. Aber ich brauche beide Werte, Schlüssel und Wert. Ich könnte 2 Listen verwenden, den Schlüssel in einem speichern, den Wert im anderen speichern, den Index außerhalb des Funktionsaufrufs speichern und den letzten Index jedesmal übergeben, wenn action_two aufgerufen wird, aber vielleicht gibt es einen kürzeren Weg, dies mit Wörterbüchern zu tun durch Speichern der Position, die das Wörterbuch irgendwie durchlaufen hat, und ich würde nicht 2 Listen verwenden müssen?

import random 
import time 

def action_one(): print "action 1" 

def action_two(): 
    diccionarios_grupos_ids = { 
    '580864492030176':'Rafaela Argentina', 
    '314744565339924':'Ventas Rafaelinas', 
    '976386572414848':'Ventas en Rafaela y Zona', 
    '157271887802087':'Rafaela Vende', 
    '77937415209':'Mas Poco Vendo', 
    '400258686677963':'Clasificados Rafaela', 
    '1708071822797472':'Vende Susana Roca Bella Italia Lehmann San Antonio Villa San Jose y Rafaela', 
    '639823676133828':'[email protected] [email protected] de las ofertas sunchales!!!!!!', 
    '686381434770519':'H&M Computacion', 
    '1489889931229181':'RAFAELA Compra/Venta', 
    '228598317265312':'Compra-Venta Rafaela', 
    '406571412689579':'Alta Venta'} 

    for key,value in diccionarios_grupos_ids.iteritems(): 
     print key,value 
     # I want to iterate in the next position the next time action_two is called 
     break 

def action_three(): print "action 3" 

lista_acciones = [action_one,action_two,action_three] 

while True: 

    tiempo_random = random.randint(1,3) 

    time.sleep(tiempo_random) 

    choice = random.choice(lista_acciones) 

    choice() 
+0

Eine Beispielausgabe würde helfen. Es ist unklar, was du fragst. – ergonaut

+0

Benötigen Sie die Elemente der Liste später? Wenn nicht, warum entfernen Sie sie nicht einfach aus der Liste, nachdem Sie sie referenziert haben, und referenzieren Sie immer das erste Element der Liste? –

Antwort

1

können Sie einen Generator verwenden:

def create_grupos_gen(): 
    diccionarios_grupos_ids = { 
    '580864492030176':'Rafaela Argentina', 
    '314744565339924':'Ventas Rafaelinas', 
    '976386572414848':'Ventas en Rafaela y Zona', 
    '157271887802087':'Rafaela Vende', 
    '77937415209':'Mas Poco Vendo', 
    '400258686677963':'Clasificados Rafaela', 
    '1708071822797472':'Vende Susana Roca Bella Italia Lehmann San Antonio Villa San Jose y Rafaela', 
    '639823676133828':'[email protected] [email protected] de las ofertas sunchales!!!!!!', 
    '686381434770519':'H&M Computacion', 
    '1489889931229181':'RAFAELA Compra/Venta', 
    '228598317265312':'Compra-Venta Rafaela', 
    '406571412689579':'Alta Venta'} 
    for key,value in cycle(diccionarios_grupos_ids.iteritems()): 
     yield key, value 

grupos_gen = create_grupos_gen() 



def action_two(): 
    key, value = next(grupos_gen) 
    print(key,value) 

action_two() 
action_two() 

# 314744565339924 Ventas Rafaelinas 
# 1489889931229181 RAFAELA Compra/Venta 

Jeder Aufruf von next(grupos_gen) einen nachfolgenden Schlüssel/Wert-Paar liefern.

Wenn Sie durch Ihre Wörterbucheinträge Schleife möchten, können Sie itertools.cycle verwenden:

from itertools import cycle 

def grupos_gen(): 
    diccionarios_grupos_ids = { 
    '580864492030176':'Rafaela Argentina', 
    '314744565339924':'Ventas Rafaelinas', 
    '976386572414848':'Ventas en Rafaela y Zona', 
    '157271887802087':'Rafaela Vende', 
    '77937415209':'Mas Poco Vendo', 
    '400258686677963':'Clasificados Rafaela', 
    '1708071822797472':'Vende Susana Roca Bella Italia Lehmann San Antonio Villa San Jose y Rafaela', 
    '639823676133828':'[email protected] [email protected] de las ofertas sunchales!!!!!!', 
    '686381434770519':'H&M Computacion', 
    '1489889931229181':'RAFAELA Compra/Venta', 
    '228598317265312':'Compra-Venta Rafaela', 
    '406571412689579':'Alta Venta'} 
    for key,value in cycle(diccionarios_grupos_ids.iteritems()): 
     yield key, value 

grupos_iter = grupos_gen() 



def action_two(): 
    key, value = next(grupos_iter) 
    print(key,value) 


for i in range(15): 
    action_two() 

# ('400258686677963', 'Clasificados Rafaela') 
# ... 
# ('228598317265312', 'Compra-Venta Rafaela') 
# ('314744565339924', 'Ventas Rafaelinas') 
# ('400258686677963', 'Clasificados Rafaela') 
# ('639823676133828', '[email protected] [email protected] de las ofertas sunchales!!!!!!') 
# ('1708071822797472', 'Vende Susana Roca Bella Italia Lehmann San Antonio Villa 

Für weitere Informationen, sehen Sie zum Beispiel bei Understanding Generators in Python

Beachten Sie auch, dass dict bestellt nicht, so Es gibt keine Garantie, dass Ihre Schlüssel/Werte in einer beliebigen reproduzierbaren Reihenfolge durchlaufen werden. Wenn Ihnen das wichtig ist, sollten Sie einen verwenden.

1

zuordnen iteritem() einer Variablen, zB:

iterable = diccionarios_grupos_ids.iteritems() 

for key,value in iterable: 
    ... 

Das Problem, das Sie benötigen, um die iterable für mehrere Anrufe auf action_two() die einfachste ist eine globale Variable zu lösen verwendet, aber globale Variablen sind in der Regel betrachten schlechter Stil:

def action_two(): 
    for key,value in iterable: 
     print key,value 
     break 

diccionarios_grupos_ids = { 
    '580864492030176':'Rafaela Argentina', 
    '314744565339924':'Ventas Rafaelinas', 
    '976386572414848':'Ventas en Rafaela y Zona', 
    '157271887802087':'Rafaela Vende', 
    '77937415209':'Mas Poco Vendo', 
    '400258686677963':'Clasificados Rafaela', 
    '1708071822797472':'Vende Susana Roca Bella Italia Lehmann San Antonio Villa San Jose y Rafaela', 
    '639823676133828':'[email protected] [email protected] de las ofertas sunchales!!!!!!', 
    '686381434770519':'H&M Computacion', 
    '1489889931229181':'RAFAELA Compra/Venta', 
    '228598317265312':'Compra-Venta Rafaela', 
    '406571412689579':'Alta Venta'} 

iterable = iter(diccionarios_grupos_ids.items()) 

Aber da Sie nur das nächste möchten, können Sie next() verwenden:

def action_two(): 
    print next(iterable) 
Verwandte Themen