【问题标题】:Finding a specific pattern in a boolean array在布尔数组中查找特定模式
【发布时间】:2021-05-03 11:00:59
【问题描述】:

我正在处理一个项目,但遇到以下问题:我有一个布尔数组,我想确定这个数组中是否存在特定模式。

例如,假设我有这个布尔数组:[True, False, False, True, False, False, True, False, True, True, True] 我想知道它是否包含以下模式 [假,假,真,假]。

我的第一个想法是遍历布尔数组的所有值,定义一个变量来计算连续“False”的数量,然后再次循环以查找“True”是否遵循该序列,等等......但似乎有点乏味,我想有更好的方法来做到这一点......

非常欢迎任何建议! 谢谢

【问题讨论】:

  • 这与在字符串问题中查找子字符串非常相似。看看this,你应该可以做到。

标签: python boolean


【解决方案1】:

一种方法是将数组转换为ft 字符的字符串,然后使用字符串搜索来查找所需的模式。例如:

def bool_list_to_str(bool_list):
    return ''.join('ft'[i] for i in bool_list)

您可以调用此函数将数组和搜索模式都转换为字符串。然后您可以使用s.find(p) 在字符串s 中搜索模式p

请注意,每个 bool 值使用一个字符,因此字符串将具有与 bool 列表相同的长度,并且索引将匹配。它还使用最少的字符串内存。

【讨论】:

  • 谢谢你,这真的很好用而且很容易实现!干杯!
  • @ms518 太好了,很高兴我能帮上忙!
【解决方案2】:

您可以将它们作为字符串加入并检查子字符串:

super_list = [True, False, False, True, False, False, True, False, True, True, True]
sub_list = [False, False, True, False]

super_list_as_str = ''.join(map(str, super_list))
sub_list_as_str = ''.join(map(str, sub_list))

if sub_list_as_str in super_list_as_str:
    print('Sub string')

【讨论】:

  • 谢谢,方法很好,效率很高
【解决方案3】:

我从编程开始,然后我的代码没有优化。但是很容易理解:

1.- 创建一个包含长度为 n 的数组的所有组合的列表

2.- 将模式与您创建的列表进行比较。

# a is the array you want to check with
a = [True, False, False, True, False, False, True, False, True, True, True]
# b is the array you want to check
b = [False, True, False, False]
# patterns is the list with all the patterns in the array
patterns = []
for i in range(len(a)-(len(b)-1)):
    patterns.append((a[i:(len(b)+i)]))

# Check if b is in the list you have create.
b in patterns

【讨论】:

  • 感谢您的回答,我已经使用了另一种方法,但也会尝试您的方法
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 2012-11-04
  • 2013-11-14
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2012-09-04
相关资源
最近更新 更多