查找困在列表中的字符数

Find number of characters trapped in a list

我的要求是最有效地找到列表中 'X' 之间的“0”数量。

如果您 运行 Python 中的以下代码:

def answer(heights):

    row = len(heights)
    col = max(heights)

    matrix = [['X' for j in range(i)] for i in heights]

    for i in range(col):

        rainWater = []

        for j in range(row):

            try:

                rainWater.append(matrix[j][i])

            except IndexError:

                rainWater.append('0')

        print rainWater

    return matrix

answer([1, 6, 5, 3, 2, 10, 4, 2, 6])

输出:

['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['0', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['0', 'X', 'X', 'X', '0', 'X', 'X', '0', 'X']
['0', 'X', 'X', '0', '0', 'X', 'X', '0', 'X']
['0', 'X', 'X', '0', '0', 'X', '0', '0', 'X']
['0', 'X', '0', '0', '0', 'X', '0', '0', 'X']
['0', '0', '0', '0', '0', 'X', '0', '0', '0']
['0', '0', '0', '0', '0', 'X', '0', '0', '0']
['0', '0', '0', '0', '0', 'X', '0', '0', '0']
['0', '0', '0', '0', '0', 'X', '0', '0', '0']

我需要在 Python 中最有效地找到被困在两个 'X' 之间的 'O'。例如

['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']  
['0', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
['0', 'X', 'X', 'X', '0', 'X', 'X', '0', 'X']   --> 2 '0' are trapped
['0', 'X', 'X', '0', '0', 'X', 'X', '0', 'X']   --> 3 '0' are trapped
['0', 'X', 'X', '0', '0', 'X', '0', '0', 'X']   --> 4 '0' are trapped

谁能帮我解决Python中的这个问题?

您可以将每一行转换为字符串,然后应用正则表达式来查找包含的 0 个字符 1:

import re

matrix = [['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
          ['0', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
          ['0', 'X', 'X', 'X', '0', 'X', 'X', '0', 'X'],
          ['0', 'X', 'X', '0', '0', 'X', 'X', '0', 'X'],
          ['0', 'X', 'X', '0', '0', 'X', '0', '0', 'X']]

pattern = re.compile(r'(?=X(0+)X)')
for row in matrix:
    print len(''.join(pattern.findall(''.join(row))))

输出

0
0
2
3
4

1 根据您的问题,我在这里使用了 0(零)。但也许它应该是O(大写o)?

我的方法会简单得多。只需计算每行中的零数,去掉两端的所有 0

实施

[''.join(row).strip('0').count('0') for row in matrix]

输出

>>> matrix = [['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
          ['0', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
          ['0', 'X', 'X', 'X', '0', 'X', 'X', '0', 'X'],
          ['0', 'X', 'X', '0', '0', 'X', 'X', '0', 'X'],
          ['0', 'X', 'X', '0', '0', 'X', '0', '0', 'X']] 
>>> [''.join(row).strip('0').count('0') for row in matrix]
[0, 0, 2, 3, 4]

这是基于这样的逻辑:如果任何行中存在任何零,并且它不在任何一端,则应该用 'X' 括起来。

matrix = [['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
      ['0', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
      ['0', 'X', 'X', 'X', '0', 'X', 'X', '0', 'X'],
      ['0', 'X', 'X', '0', '0', 'X', 'X', '0', 'X'],
      ['0', 'X', 'X', '0', '0', 'X', '0', '0', 'X']]

[each[1:-1].count('0') for each in matrix]