【问题标题】:How do I check for a string element stored in a variable in a list?如何检查存储在列表变量中的字符串元素?
【发布时间】:2016-01-22 14:28:01
【问题描述】:

我有一个程序,本质上是针对学生的考试程序。该程序包含两个包含相反含义的单词的列表,它们都在相同的位置索引中。例如,list1 中的 hot 和 list2 中的冷都在索引 0 中。

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

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

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

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

注意:决策者功能在程序中的其他功能之前,列表如下:

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

有什么想法吗?

【问题讨论】:

  • 请提供更清晰的信息。阅读this

标签: python list function random duplicates


【解决方案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 已经返回了一个列表。

【讨论】:

  • 是的,没错。在相反的单词列表中,没有重复,但是当我开始生成对时,这又会导致问题中的重复。
  • 如何将随机样本应用到这个程序中?
  • 代码示例中有错字,请检查括号
  • 你确定吗?据我所知,sample 的第二个参数没有默认值。该调用引发异常/回溯
  • @Pynchia 太晚了;我开始眼花缭乱了。再次感谢。
猜你喜欢
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多