如何检查存储在列表中变量中的字符串元素?

时间:2015-10-23 06:03:33

标签: python list function random duplicates

我的课程基本上是针对学生的考试计划。该程序包含两个包含相反含义的单词的列表,所有这些都在相同的位置索引中。例如,list1中的hot和list2中的cold2中的cold。

我创建了一个函数,允许随机生成并打印问题以供用户完成。检查答案以确保用户给出的组合是正确的。我现在正在尝试创建一个函数,确保程序中没有任何问题重复,我正在努力。

我尝试创建一个函数,将随机选择的单词对存储在变量中,然后将其附加到列表中。在每个问题之后,函数应该检查列表中的变量,如果变量存在,变量将调用重新生成新对的函数。这一直持续到问题全部完成且没有重复。程序正确地将变量存储在列表中(我通过打印列表进行检查)但是当存在重复时,对生成器函数不起作用,并且在问题中进行重复。

我想要创建的函数的代码如下,以及随机对生成器和列表的代码。任何想法,我都需要尽快帮助。

功能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()

功能B:

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

注意:决策者函数位于prorgam中的其他函数之前,列表如下:

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"]

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

不要一个一个地生成问题,而是使用random.sample一次选择所有索引。然后,您可以保证没有重复项,并且可以避免所有这些检查。

例如,random.sample(range(len(opposite1)), 10)将为您提供十个索引。

另一种选择,在我看来,更好的解决方案是将两个相对的列表压缩在一起,然后只选择所需的对数。那么你根本不必弄乱指数。

编辑:重新阅读你的问题,我不确定我是否理解它。我认为这意味着你试图避免在生成的列表中重复,并且在原始的对立列表中没有重复。

以下是生成10个问题的示例:

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)

在一次运行中,这打印

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

此代码适用于python 3.在python 2中,您将使用

zip(opposite1, opposite2)  

而不是

list(zip(opposite1, opposite2)) 

因为在python 2中,zip已经返回一个列表。