当前位置: 首页 > 知识库问答 >
问题:

Pyexcel random.choice()不太符合我的需要

芮宇航
2023-03-14

那么,我如何循环一个函数来随机拉一个元素,如果它不符合某些参数,就拉一个不同的元素呢?

我是相当新的Python和诚实的一般编码。所以让我解释一下我在做什么。

该项目基本上是为一号和二号玩家自动选择角色。在excel中有一个字符列表,包括名称、它们的“啄”号、赢、输等。我用“啄”号来决定挑选什么角色。

每次程序运行时,所有字符的啄号都会增加1。

然后,它生成一个包含所有字符名称和啄号的列表列表。

然后它找到最高的啄鸟数,并将其命名为fighter 1。(如果有平局,则选择)

现在(我被卡住的部分)它随机拉出一个列表,检查1)它不是战士1和2)它的啄数是否超过某个值,并使那个玩家2。(我使它成为半确定性随机的方法)

def another_one(sequence):
    item = random.choice(sequence)
    if item[0] == fighter_one:
        another_one(sequence)
    elif item[1] < 20:
        another_one(sequence)
    else:
        new_guy = item
        return new_guy

如果我是正确的,它似乎是随机地拉第一个“项目”,但如果它碰到“如果”或“elif”,它就结束了?我不知道。任何帮助都将不胜感激。

编辑:好的,所以我添加了一个打印(“如果失败”)和(“elif失败”),以查看它是否击中了它,并且它正在打印“elif失败”行两次。所以我认为它说,一旦它第一次运行,“随机”元素现在是永久的?

共有1个答案

高明辉
2023-03-14

看起来您正在尝试执行递归,但是您忘记返回以通过另一个调用链将结果传播回来。因此,修复看起来像:

def another_one(sequence):
    item = random.choice(sequence)
    if item[0] == fighter_one:
        return another_one(sequence)
    elif item[1] < 20:
        return another_one(sequence)
    else:
        new_guy = item
        return new_guy

但是,如果您只检查这些条件,那么可能不需要递归。循环更清晰,不会遇到递归限制。这是等效循环的外观:

def another_one(sequence):
    while True: # return will exit an infinite loop
        item = random.choice(sequence)
        if item[0] != fighter_one and item[1] >= 20:
            new_guy = item
            return new_guy

当然,这两种情况都假设sequence确实包含您要寻找的战斗机。如果没有,递归将在循环中运行,直到达到递归限制,循环将永远在循环中运行。

所以就我个人而言,我会反复检查序列,确保有合适的战斗机,然后从中随机选择:

# fighter_one and min_value are arguments because I don't like global variables
def another_one(sequence, fighter_one, min_value = 20):
    candidates = []
    
    for item in sequence:
        if item[0] != fighter_one and item[1] >= min_value:
            candidates.append(item)
        
    if len(candidates) == 0:
        return None
    else:
        return random.choice(candidates)

 类似资料:
  • 问题内容: 我有一个我重写了hashCode方法和equals方法的类。equals方法的行为符合我的预期,但是hashCode方法的行为似乎不符合我的预期。因此,我假设我的期望是不正确的,但不确定原因。下面是重写的方法: 现在,我有一个测试类,其中创建两个car对象,并调用equals方法,然后将car的每个实例放入HashMap中。我将每个实例设置为具有相同的汽车名称和模型,并调用equals

  • 我在显示索引时遇到了一些问题。html。应用属性为空。Spring靴v2。6.2、java 11、html 5。 upd1:我得到了这个stacktrace。 在此输入图像描述在此输入图像描述

  • 我有一个红色像素图像,我想在红色像素处显示另一个图像,所以我编写了以下代码: 我的代码太大了,所以我在这里写了什么是重要的。不管怎样,当我运行它时,我得到这个错误: 回溯(最近一次调用):文件“C:\Users\AndréLuiz\Desktop\equality\equality.py”,第171行,在screen.blit(w_plat,w_pos)类型错误:blit的目标位置无效 检查后,打

  • 问题 你想去掉文本字符串开头,结尾或者中间不想要的字符,比如空白。 解决方案 strip() 方法能用于删除开始或结尾的字符。 lstrip() 和 rstrip() 分别从左和从右执行删除操作。 默认情况下,这些方法会去除空白字符,但是你也可以指定其他字符。比如: >>> # Whitespace stripping >>> s = ' hello world \n' >>> s.strip()

  • 问题内容: JavaScript是否使用不可变或可变的字符串?我需要一个“字符串生成器”吗? 问题答案: 他们是一成不变的。您不能使用诸如此类来更改字符串中的字符。该字符串操作方法,例如,返回新的字符串。 同样,如果您对同一个字符串有两个引用,则修改一个不会影响另一个 但是,我总是听到Ash在他的回答中提到的内容(使用Array.join进行连接的速度更快),因此我想测试一下连接字符串并将最快的方