调用在另一个函数中进行绘图的python函数



我正在尝试制作一个函数,该函数绘制一个介于1和3之间的随机数,并在另一个函数中调用它。在这个函数中,如果第一个函数的绘图中选择的数字是1,它将返回一个列表,其中最多有3个选项。如果是2,则从listTwo返回最多三个可能的选项,但是输出没有正确输出

这是我的代码:


from random import random, randint, sample, choices
import csv
class Test(object):
def __init__(self):
self.data = dict()
def foo1(self):
return randint(1,3)
def foo2(self):
n = 3
for i in range(n):
r = self.foo1()
if (r == 1):
listOne = ['A', 'B', 'C']
smpOne = choices(listOne, k = randint(1,3))
return smpOne
elif (r == 2):
listTwo = ['D', 'E', 'F']
smpTwo = choices(listTwo, k = randint(1,3))
return smpTwo
elif (r == 3):
listThree = ['G', 'H', 'I']
smpThree = choices(listThree, k = randint(1,3))
return smpThree

def concat(self, nToGenerate):
for i in range(nToGenerate):
self.data[i] = {'foo 1': self.foo1(), 'foo2': self.foo2()}
return self.data
if __name__ == '__main__':
try:
nToGenerate = int(input("How tests?"))
except ValueError:
print("Sorry, not a number")
test = Test()
myDict = test.concat(nToGenerate)
with open('test.csv', "w", newline='') as csvfile:
fieldnames = list(myDict.values())[0].keys()
writerFile = csv.DictWriter(csvfile, fieldnames)
writerFile.writeheader()
for key in myDict:
writerFile.writerow({field: myDict[key].get(field) or key for field in fieldnames})

这是10次测试的输出:

foo 1,foo2
2,['H']
1,"['A', 'B', 'B']"
2,"['A', 'A']"
2,"['F', 'E']"
**1,"['I', 'I']"**
2,['B']
2,"['H', 'G']"
2,['B']
2,"['D', 'F']"
3,"['I', 'G']"

正如我们所看到的,有一个出口画出了数字1,并列出了一个列表["I","I"]然而,我的信只能出现在一个号码为3的的名单上

当您在中调用foo1

def concat(self, nToGenerate):
for i in range(nToGenerate):
self.data[i] = {'foo 1': self.foo1(), 'foo2': self.foo2()}
...

然后再次进入:

def foo2(self):
n = 3
for i in range(n):
r = self.foo1()
...

foo1的两次调用都返回一个新的伪随机数。没有理由认为它们应该总是相同的随机数。


最简单的解决方案是简单地让foo2接受一个参数。此参数将是伪随机数,它将在concat中生成,然后传递给foo2。您可以消除foo2中的for循环,因为它什么都不做(无论如何,您都可以在第一次迭代中返回(。您可以通过创建一个字典来消除if语句,将r的三个可能值映射到不同的列表:

def foo2(self, r):
return choices({
1: ["A", "B", "C"],
2: ["D", "E", "F"],
3: ["G", "H", "I"]
}[r], k=randint(1, 3))

您还必须更改concat。对于For循环的每次迭代,我们都会生成一个新的随机数。该随机数成为"foo 1"键值对的值,并被传递到foo2中以获得"foo 2"键值对的数值:

def concat(self, nToGenerate):
for i in range(nToGenerate):
r = self.foo1()
self.data[i] = {"foo 1": r, "foo 2": self.foo2(r)}
return self.data

我认为问题的出现是因为您调用了foo1两次,一次在foo2中,另一次在为其分配self.data时。这将导致随机整数函数产生两个不同的结果,因此无法保证打印的值与传递给foo2的值匹配。您可以通过返回foo2中的foo1值以及元组形式的返回来解决此问题,然后在分配给self.data时使用索引。希望我能正确理解并提供帮助。

最新更新