如何根据 X 数量的 'True' 值获取 n 长度的布尔数组
How to get n-length Boolean array with conditions on X amount of 'True' values
我有以下具有二元结果(即 1 或 0)的事件列表:
events=['A', 'B', 'C']
outcomes=[True,False]
在每种情况下,这些结果中只有一个可以为真。有没有办法得到这样的数组:
array=([True,False,False],[False,True,False], [False,False,True])
我知道我可以将 itertools 产品与 repeat 一起使用,但这会在数组中产生不需要的场景,例如 [True,True,True] 等。理想情况下,我不必过滤它,因为我希望我的 'events' 列表比上面的长得多。
有人有什么想法吗?我可以在数组中有 1 个或 0 个值,我并不大惊小怪。
您可以自己创建一个生成器。
def one_true(length):
i = 0
while i < length:
lst = [False] * length
lst[i] = True
yield lst
i +=1
print(list(one_true(3)))
这看起来相当简单,因为您的 True
只需要“爬行”整个数组。
如果你想包含它们都是 False
的情况,只需在末尾添加 yield [False] * length
。
def one_true(length):
i = 0
while i < length:
lst = [False] * length
lst[i] = True
yield lst
i +=1
yield [False] * length
print(list(one_true(3)))
从你的例子来看:
events = ['A', 'B', 'C']
print(list(one_true(len(events))))
或者如果你想更简洁,你可以使用带有自定义函数的理解。
def insert_true(lst, index):
lst[index] = True
return lst
events = ['A', 'B', 'C']
length = len(events)
foo = [insert_true([False] * length, i) for i in range(length)]
print(foo)
我有以下具有二元结果(即 1 或 0)的事件列表:
events=['A', 'B', 'C']
outcomes=[True,False]
在每种情况下,这些结果中只有一个可以为真。有没有办法得到这样的数组:
array=([True,False,False],[False,True,False], [False,False,True])
我知道我可以将 itertools 产品与 repeat 一起使用,但这会在数组中产生不需要的场景,例如 [True,True,True] 等。理想情况下,我不必过滤它,因为我希望我的 'events' 列表比上面的长得多。
有人有什么想法吗?我可以在数组中有 1 个或 0 个值,我并不大惊小怪。
您可以自己创建一个生成器。
def one_true(length):
i = 0
while i < length:
lst = [False] * length
lst[i] = True
yield lst
i +=1
print(list(one_true(3)))
这看起来相当简单,因为您的 True
只需要“爬行”整个数组。
如果你想包含它们都是 False
的情况,只需在末尾添加 yield [False] * length
。
def one_true(length):
i = 0
while i < length:
lst = [False] * length
lst[i] = True
yield lst
i +=1
yield [False] * length
print(list(one_true(3)))
从你的例子来看:
events = ['A', 'B', 'C']
print(list(one_true(len(events))))
或者如果你想更简洁,你可以使用带有自定义函数的理解。
def insert_true(lst, index):
lst[index] = True
return lst
events = ['A', 'B', 'C']
length = len(events)
foo = [insert_true([False] * length, i) for i in range(length)]
print(foo)