如何获取 n 长度的布尔数组,条件为 X 数量的“True”值

How to get n-length Boolean array with conditions on X amount of 'True' values

提问人:beginner_python 提问时间:3/24/2021 更新时间:3/24/2021 访问量:469

问:

我有以下具有二元结果(即 1 或 0)的事件列表:

events=['A', 'B', 'C']
outcomes=[True,False]

在每种情况下,这些结果中只有一个可以为 True。有没有办法得到一个数组,比如:

array=([True,False,False],[False,True,False], [False,False,True])

我知道我可以将 Itertools 产品与重复一起使用,但这会在数组中产生不需要的场景,例如 [True,True,True] 等。理想情况下,我不必过滤它,因为我希望我的“事件”列表比上面的要长得多。

有人有什么想法吗?我可以在数组中有 1 或 0 个值,我不大惊小怪。

数组 python-3.x python-itertools boolean-logic

评论


答:

0赞 Axe319 3/24/2021 #1

您可以创建一个生成器来自己完成。

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

如果您想包含它们都存在的案例,只需在末尾添加即可。Falseyield [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)

评论

0赞 beginner_python 3/24/2021
工作了一个魅力,谢谢!使用了insert_true功能。如果有兴趣,这似乎也有效,回答类似的问题:stackoverflow.com/questions/65374372/......