如何在2D列表中查找与特定模式匹配的元素

棒棒糖

我想找到一种有效的方法来检索数组中与特定模式匹配的所有元素。

例如,考虑到我有:

  • M由不同大小的子数组组成的数组:

      M = [[0, 1],
           [3, 2, 4],
           [3, 8],
           [9],
           [0, 2],
           [3, 1],
           [0, 3],
           [2, 4],
           [3, 7]]
    
  • 子数组的模式。例如,[[a, b], [a, c], [a, d]]matchs [[0, 1], [0, 2], [0, 3]]

如何返回M与模式相对应的所有元素

到目前为止,我一直在使用for循环来查找匹配的元素,但是当模式具有两个以上的子数组时,这种幼稚的方法会变得非常昂贵。

例:

M = [[0, 1], [3, 2, 4], [3, 8], [9], [0, 2], [3, 1], [0, 3], [2, 4], [3, 7]]

# pattern with 3 sub-arrays -> [[a, b], [a, c], [a, d]]

for i, arr1 in enumerate(M):
    for j, arr2 in enumerate(M):
        for k, arr3 in enumerate(M):
            if i != j != k:
                if len(arr1) == len(arr2) == len(arr3) == 2:
                    a1, a2, a3 = arr1[0], arr2[0], arr3[0]
                    b, c, d = arr1[1], arr2[1], arr3[1]
                    if a1 == a2 == a3 and b < c < d:
                        print arr1, arr2, arr3

输出:

[0,1], [0,2], [0,3]
[3,1], [3,7], [3,8]

由于每个子阵列都需要一个额外的嵌套循环,因此此方法的时间复杂度(O(n^k)其中k的子阵列数量)成为一个问题。

是否可以加快此过程?如果是这样,怎么办?

疯狂物理学家

首先,在进入numpy之前,让我们看一下您的情况。您需要子数组仅包含两个元素。因此,让我们预过滤您的数组:

M = [m for m in M if len(m) == 2]

现在你正在检查a1 == a2 == a3 and b < c < d,但每一种可能的排列bcd的顺序显示出来。因此,实际上,如果找到给定的任何 b != c != d一个a,则可以知道最终会出现该顺序,将其重新排列为正确的顺序。

因此,一个很简单的方法来处理,这是构建一个字典映射a到所有可能的选项bcd,它们进行过滤最少的“子阵”你想,排序它们的数量,并计算所有可能的组合:

# set removed duplicates automatically
options = collections.defaultdict(set)

for a, b in (m for m in M if len(m) == 2):  # Use a generator to filter on-the-fly
    options[a].add(b)

for a, bcd in options.items():
    # sort (combinations automatically filters too-short bins)
    for b, c, d in itertools.combinations(sorted(bcd), 3):
        print(f'[{a}, {b}], [{a}, {c}], [{a}, {d}]')

该解决方案可能在算法上是最佳的。它对初始列表进行一次遍历以识别潜在的模式,然后对每个模式执行一次精确的迭代。这里唯一可能丢失的是完全消除了重复项。您可以使用collections.Counter代替来处理重复项set

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在2D列表python中查找列表的相同元素

来自分类Dev

如何对列表中的元素使用模式匹配?

来自分类Dev

如何在文件夹中查找与特定模式匹配(或不匹配)的所有文件?

来自分类Dev

如何在所有元素都相同的python中创建2D列表?

来自分类Dev

球拍-查找在2D列表中具有相同元素的列表

来自分类Dev

如何在python中的矩阵(列表列表)中查找特定元素

来自分类Dev

如何在飞镖列表中查找元素

来自分类Dev

如何在列表中查找元素是连续的

来自分类Dev

如何在Numpy中更改2D数组元素?

来自分类Dev

如何在python中遍历2D列表

来自分类Dev

如何在python中反转2d列表

来自分类Dev

如何在python中遍历2D列表

来自分类Dev

“for”循环如何在 2D 列表中工作?

来自分类Dev

在Haskell中具有2个元素的模式匹配列表

来自分类Dev

如何查询匹配特定模式的Matlab结构中的变量列表?

来自分类Dev

如何查找与模式列表不匹配的行?

来自分类Dev

如何查找与模式列表不匹配的行?

来自分类Dev

在python中的2D数组中计数并查找模式

来自分类Dev

如何在某些Access数据中查找特定模式?

来自分类Dev

如何在Redis中删除与特定模式匹配的键

来自分类Dev

如何使用C在2D数组中查找连续元素

来自分类Dev

通过模式匹配在Scala中递归查找列表的第n个元素

来自分类Dev

如何在以另一列表的一个元素开头的行列表中查找特定行?

来自分类Dev

如何在3D Numpy数组中查找2D数组的行

来自分类Dev

如何在C中的动态2D字符数组中查找行数?

来自分类Dev

如何在 C++ 中的 2d 哈希表中查找值

来自分类Dev

如何从给定索引中构成2D列表中的元素?

来自分类Dev

我如何设置2D数组中某些元素的值(使用numpy在列表中)?

来自分类Dev

如何根据索引列表从2D列表中的每个1D列表中选择一个元素?

Related 相关文章

  1. 1

    如何在2D列表python中查找列表的相同元素

  2. 2

    如何对列表中的元素使用模式匹配?

  3. 3

    如何在文件夹中查找与特定模式匹配(或不匹配)的所有文件?

  4. 4

    如何在所有元素都相同的python中创建2D列表?

  5. 5

    球拍-查找在2D列表中具有相同元素的列表

  6. 6

    如何在python中的矩阵(列表列表)中查找特定元素

  7. 7

    如何在飞镖列表中查找元素

  8. 8

    如何在列表中查找元素是连续的

  9. 9

    如何在Numpy中更改2D数组元素?

  10. 10

    如何在python中遍历2D列表

  11. 11

    如何在python中反转2d列表

  12. 12

    如何在python中遍历2D列表

  13. 13

    “for”循环如何在 2D 列表中工作?

  14. 14

    在Haskell中具有2个元素的模式匹配列表

  15. 15

    如何查询匹配特定模式的Matlab结构中的变量列表?

  16. 16

    如何查找与模式列表不匹配的行?

  17. 17

    如何查找与模式列表不匹配的行?

  18. 18

    在python中的2D数组中计数并查找模式

  19. 19

    如何在某些Access数据中查找特定模式?

  20. 20

    如何在Redis中删除与特定模式匹配的键

  21. 21

    如何使用C在2D数组中查找连续元素

  22. 22

    通过模式匹配在Scala中递归查找列表的第n个元素

  23. 23

    如何在以另一列表的一个元素开头的行列表中查找特定行?

  24. 24

    如何在3D Numpy数组中查找2D数组的行

  25. 25

    如何在C中的动态2D字符数组中查找行数?

  26. 26

    如何在 C++ 中的 2d 哈希表中查找值

  27. 27

    如何从给定索引中构成2D列表中的元素?

  28. 28

    我如何设置2D数组中某些元素的值(使用numpy在列表中)?

  29. 29

    如何根据索引列表从2D列表中的每个1D列表中选择一个元素?

热门标签

归档