我有一个像这样的numpy数组:
answer = [1, 0, 1, 0, 2, 1, 0...,1, 1, 0,] # of size m
每个答案条目都是0到2之间的一个数字。
我还有另一个像这样的numpy数组:
remains_doors = [ [0,2], [0,1], [1,2], ... [1,2], [0,1],] # of size m
mains_doors的每个条目都是2个0到2之间的数字的列表,这些数字不能相同。
我需要使用以下条件从answer和stills_doors创建一个名为new_array的新数组: 对于每组,我必须保留不回答的相应数据,或者如果不存在该数据,则选择一个随机值。 例如:
answer = [1, 0, 1, 2, 1 ,0]
remains_doors = [ [0,1], [1,2], [0,1], [2,0], [1,0], [0,1]]
new_array = [0, 2, 0, 0, 0, 1]
困难在于,为此,我不必使用任何循环(for,while)。 (供您参考,这是每月礼堂问题的一部分)
答案 0 :(得分:0)
查找zip
命令的文档,并在python中搜索有关列表推导的信息。
看着您的问题,您得到的第二个位置与[1,2]相比为0,则答案为2,所以:
new_array = [max(z for z in y if z != x) for x,y in zip(answer,remains_doors)]
如果要[1,2]而不是2,则删除max
通话。
答案 1 :(得分:0)
如果不允许使用任何for
或while
循环,也许可以进行递归?
answer = [1, 0, 1, 2, 1 ,0]
remains_doors = [[0,1], [1,2], [0,1], [2,0], [1,0], [0,1]]
new_array = [0, 2, 0, 0, 0, 1]
import random
def do_the_job(answer, doors, idx = 0, new_array = []):
end = len(answer)
if idx < 0 or idx >= end:
return
a = answer[idx]
d = doors[idx]
if a in d:
d.remove(a)
new_array.append(d[0])
else: new_array.append(random.sample(d, 1)[0])
do_the_job(answer, doors, idx + 1, new_array)
return new_array
print(do_the_job(answer, remains_doors))
#=> [0, 2, 0, 0, 0, 1] or sometimes [0, 1, 0, 0, 0, 1]