查找列表中捕获的字符数

时间:2015-09-01 03:12:33

标签: python performance list matrix processing-efficiency

我的要求是找到列表中'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

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

您可以将每一行转换为字符串,然后应用正则表达式来查找包含的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)?

答案 1 :(得分:3)

我的方法会简单得多。只计算每一行中的零数量,删除任何一端的所有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]

这是基于这样的逻辑:如果任何行中存在任何零,并且它不在任何一端,则应该用&#39; X&#39;。

包围。

答案 2 :(得分:1)

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]