2015-10-23 3 views
0

J'ai un programme qui est essentiellement un programme d'examen pour les étudiants. Le programme contient deux listes qui contiennent des mots de sens opposés, tous dans le même index de position. Par exemple hot dans list1 et cold dans list2 tous les deux dans l'index 0.Comment vérifier un élément de chaîne stocké dans une variable d'une liste?

J'ai créé une fonction qui permet à la question d'être générée aléatoirement et imprimée pour que l'utilisateur complète. Les réponses sont vérifiées pour s'assurer que la combinaison donnée par l'utilisateur est correcte. J'essaie maintenant de créer une fonction qui assure qu'aucune question dans le programme ne se répète, et je me bats.

J'ai tenté de créer une fonction qui stocke les paires de mots choisies au hasard dans une variable, qui est ensuite ajoutée dans une liste. Après chaque question, la fonction est supposée vérifier la variable dans la liste, et si la variable est présente, la variable appelle la fonction qui recrée une nouvelle paire. Cela continue jusqu'à ce que les questions soient toutes terminées et qu'il n'y ait pas de doublons. Le programme stocke correctement les variables dans la liste (j'ai vérifié en imprimant la liste) mais quand il y a un doublon, la fonction de générateur de paire ne fonctionne pas, et les doubles sont faits dans les questions.

Le code de la fonction que j'essaie de créer est ci-dessous, ainsi que pour le générateur de paires aléatoires et la liste. Toutes les idées, j'ai besoin d'aide à ce sujet dès que possible.

Fonction A:

def randcheck(): 
    global dcheck4 
    dcheck = opposite1[decider] 
    dcheck2 = opposite2[decider] 
    dcheck3 = opposite1[decider2] 
    dcheck4 = opposite2[decider2] 
    dchecklist.append(dcheck) 
    dchecklist.append(dcheck2) 
    dchecklist.append(dcheck3) 
    dchecklist.append(dcheck4) 
    print(dchecklist) 

    while dcheck in dchecklist: 
     deciders()  
    while dcheck2 in dchecklist: 
     deciders() 
    while dcheck3 in dchecklist: 
     deciders() 
    while dcheck4 in dchecklist: 
     deciders() 

Fonction B:

def deciders(): 
    global countdown 
    countdown = len(opposite1) - 1 
    global decider 
    decider = random.randint(0,countdown) 
    global decider2 
    decider2 = random.randint(0,countdown) 

Note: La fonction décideurs vient avant l'autre fonction dans le prorgam, et la liste est ci-dessous:

global opposite1 
opposite1 = ["hot", "summer", "hard", "dry", "heavy", "bright", "weak", "male", "sad", "win", "small", "ignore", "buy", "succeed", "reject", "prevent", "exclude"] 
global opposite2 
opposite2 = ["cold", "winter", "soft", "wet", "light", "dark", "strong", "female", "happy", "lose", "big", "pay attention", "sell", "fail", "accept", "allow", "include"] 

Des idées?

+0

veuillez fournir des informations plus claires. Lisez [this] (http://stackoverflow.com/help/mcve) – Pynchia

Répondre

1

Au lieu de générer les questions une à une, utilisez random.sample pour choisir tous les indices à la fois. Ensuite, vous êtes assuré qu'il n'y a pas de doublons, et toute cette vérification est évitée.

Par exemple, random.sample(range(len(opposite1)), 10) vous donnera dix indices.

Une alternative, et à mon avis, une meilleure solution est de compresser les deux listes opposées ensemble, puis il suffit de choisir le nombre requis de paires. Alors vous n'avez pas du tout à jouer avec les indices.

EDIT: En relisant votre question, je ne suis pas certain de l'avoir compris. Je suppose que vous essayez d'éviter les doublons dans la liste générée, et qu'il n'y a pas de doublons dans les listes originales des contraires.

Voici un exemple de génération de 10 questions:

import random 

opposite1 = ["hot", "summer", "hard", "dry", "heavy", "bright", "weak", "male", "sad", "win", "small", "ignore", "buy", "succeed", "reject", "prevent", "exclude"] 
opposite2 = ["cold", "winter", "soft", "wet", "light", "dark", "strong", "female", "happy", "lose", "big", "pay attention", "sell", "fail", "accept", "allow", "include"] 

questions = random.sample(list(zip(opposite1, opposite2)), 10) 
for question in questions: 
    print(question) 

Dans un essai, ce imprimé

('hot', 'cold') 
('reject', 'accept') 
('sad', 'happy') 
('succeed', 'fail') 
('buy', 'sell') 
('dry', 'wet') 
('heavy', 'light') 
('hard', 'soft') 
('weak', 'strong') 
('win', 'lose') 

Ce code est pour python 3.En python 2, vous devez utiliser

zip(opposite1, opposite2) 

au lieu de

list(zip(opposite1, opposite2)) 

car en python 2, zip retourne déjà une liste.

+0

Oui c'est correct. Dans la liste des mots opposés, il n'y a pas de doublons, mais il y a quand je commence à générer les paires, ce qui, à son tour, provoque des doublons dans les questions. –

+0

Comment puis-je appliquer un échantillon aléatoire à ce programme? –

+0

il y a une faute de frappe dans l'exemple de code, vérifiez vos parenthèses – Pynchia