如何根据 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)