python - 获取任何偶数维度的 2D 列表,并返回一个包含每个 2 X 2 网格的事物计数的列表 (Python)

标签 python arrays list matrix

我正在尝试创建一个函数,该函数将采用以下列表:

l = [["A", 1, 2, 3, 4, 5],
     ["A", "A", 2, 3, 4, 5],
     [1, 2, 3, 4, 5, 5],
     ["A", "A", "A", "A", "A", "A"],
     ["A", 3, "A", 4, "A", "A"],
     [1, 3, 5, "A", 5, "A"]
     ]

和一个键,例如“A”。并根据 KEY 在每个 2x2 单元格的 2D 列表中出现的次数给出一个包含 int 的列表。例如一个函数

def count_in_grids(l, key):

将返回

[3, 0, 0, 2, 2, 2, 1, 2, 3]

到目前为止,我写的代码非常糟糕。我通常在操作二维列表时遇到困难。因为这实际上是一项作业,所以我不允许使用任何库。如果有人能帮助我理解并写下这篇文章,我将非常感激。

到目前为止我写的蹩脚代码:

def countInGrids(l, thing):
new_list = []  # created a final list that will be returned
count = 0
for line in range(0, len(l), 2):  # Access lines
    for el in range(0, line, 2):  # Access elements
        #count + count() of all elements in line[el] to line[el+1], 
        move 2 lines down and repeat.
        count += line[line[el]:line[el]+1].count(thing) 
        count += line+1[line[el]:line[el]+1].count(thing)

        new_list.append(count)
print(new_list)
return new_list

输出: 第 63 行,在 countInGrids 中 count += line[line[el]:line[el]+1].count(thing) 类型错误:“int”对象不可订阅

P.S:如果有人想知道,这是我的第一学期计算机科学实验室

最佳答案

这可能有点笨拙,但列表理解始终是一个选择。

def countInGrid(grid, key):
    return [sum([v[i:i+2].count(key) for v in grid[j:j+2]])
            for j in range(0, len(grid), 2) for i in range(0, len(grid[0]), 2)]

经过这个过程,它用来得出 2x2 网格的是 [v[i:i+2] for v in grid[j:j+2]。如果您多次对整个列表列表执行此操作,这不是一个 super 高效的操作,但写入速度很快。

要对键进行计数,它首先使用 .count(key) 对每一行进行计数,然后使用 sum( 将 2x2 网格中的每 2 行相加)

最后一行是您如何选择要查看的 2x2 网格。它指定您将从哪里开始和从哪里结束。如果您不想先遍历列再遍历行,则 ij 的顺序非常重要。

列表理解基本上将以下所有小组件包装成更严格的语法。

def count_row(v, key):
    return v.count(key)

def count_grid(grid, key):
    return sum(count_row(v, key) for v in grid)

def get_nxn(grid, i, j, n=2):
    return [v[i:i+n] for v in grid[j:j+n]]

def iter_block_row(grid, j):
    for i in range(0, len(grid[0]), 2):
        yield get_nxn(grid, i, j)

def iter_grid(grid):
    for j in range(0, len(grid), 2):
        # In Python 3.3+, use
        # yield from iter_block_row(grid, j)
        for g in iter_block_row(grid, j):
            yield g

def count_in_grid(grid, key):
    return [count_grid(g, key) for g in iter_grid(grid)]

将大问题视为由小部分组成有助于使任何经验都可以管理它们。看到您不需要任何额外的语法糖和语言技巧来以干净的方式实现相同的目标也很有帮助。

注意get_nxn()中的切片效率非常低。这是分解问题的一种方法(我认为从概念上思考最简单的方法),但它不是最有效的。

更新我对get_nxn()效率低下的看法是错误的。看起来 Python 中的列表切片不会复制数据,即使早到 Python 2.7+ 也是如此。 get_nxn() 操作以相对于 grid 大小的恒定时间运行,而且这是一个快速的恒定时间。

关于python - 获取任何偶数维度的 2D 列表,并返回一个包含每个 2 X 2 网格的事物计数的列表 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434485/

相关文章:

python - 光栅到 ASCII - 在 Python 中添加处理多个文件的代码片段

c# - 如何保持列表中数据的顺序

python - 为什么我的类的 __new__() 方法不返回该类的实例?

python - 方法需要 1 个位置参数,但已给出 2 个

python - Mathematica 中的临时变量

Python 日志记录模块始终使用相同的文件

javascript - 将对象数组转换为对象到对象

java - 将列表转换为索引数组

python - 将列表转换为 numpy 数组

python - 使用 lambda 通过更改/修改旧列表来创建新列表