[英]Rewriting Python code to remove zip and cycle functions for Javascript translation
如果可能的话,我需要一些帮助来重写一些 Python 代码,以排除 zip 和循环功能。 我仍然是编码新手,所以我不确定它是否可行。
我正在使用一个名为 PsychoPy 的程序为学生构建实验,我们也可以在其中在线上传它们。 对于在线上传,有一个 autoJS 选项,但是对于 zip 和循环,我似乎找不到等效的 JS。
我的代码就是这样
for x in savedImages1:
for y in savedImages2:
if x == y:
choiceImages.append(x)
for z in choiceImages:
while choiceImages.count(z) < 60:
choiceImages.append(z)
combinedList = list(zip(choiceImages, cycle(labelsWhole)))
combinedList = [list (elem) for elem in combinedList]
random.shuffle(combinedList)
基本上这里发生的事情是有一个列表(choiceImages),他们之前选择的图像填充了这个列表(60 次)。 因此,如果您选择图像 A,它会将图像 A 添加到 choiceImages 60 次。 labelsWhole 是一个预制列表,也包含 60 个项目,其中他们的图像选择与 labelsWhole 中的每个图像配对(例如 [A,A],[A,B],[A.,C] 等)。 然后将该列表打乱,以便保留图像对(例如 [A,B][B,E] 等)。 我将它们压缩为一个列表,因此图像对在洗牌过程中保持不变,就好像我只是分别洗牌了choiceImages和labelsWhole我最终可以得到[A,B],[A,B] [B,A] [B,A ] 我应该只得到 [A,A] [A,B] [B,A] [B,B]。 希望这是有道理的。 然后我后来将这些对分成两个单独的列表,然后保持不变。
所以我需要一种方法,无需 zip 或循环功能:
将图像相互配对,使每个图像只与另一个配对一次,因此可以洗牌和拆分盘子。
循环遍历 labelsWhole 以添加额外的迭代(例如,如果他们选择 4 个图像开始,choiceImages 将具有每个图像 * 60,因此 labelsWhole 需要添加到列表中 4 次)。
我希望我已经解释得足够好。 如果不是,请让我知道哪里没有意义,我会尽力解释得更好。
最好的祝愿
您可以实现zip
和cycle
的自制版本。
如果您查看文档,您将看到“大致等效”的版本,但它们仍在使用一些典型的 Python 构造,这可能难以转换为 JS。
因此,如果您不能将生成器的概念转移到 JS,您将需要有返回完整列表的版本,而不是一次生成一个元素。
以下是两种可能的实现,我试图使它们尽可能非 Pythonic:
def myzip(iterables):
minlen = 2**64-1
for it in iterables:
ln = len(it)
if ln < minlen:
minlen = ln
out = []
for j in range(minlen):
t = []
for it in iterables:
t.append(it[j])
out.append(t)
return out
def mycycle(iterable, count):
ln = len(iterable)
out = []
for j in range(count):
out.append(iterable[j % ln])
return out
myzip(('ABCD', 'XY'))
[['A', 'X'], ['B', 'Y']]
mycycle('ABCD',13)
['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A']
请注意, cycle
会无限重复,因此我添加了一个count
参数来说明您想要多少个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.