【问题标题】:In a list of lists, is there a way to get the elements in an element's row and column simultaneously? [duplicate]在列表列表中,有没有办法同时获取元素的行和列中的元素? [复制]
【发布时间】:2013-04-17 06:49:17
【问题描述】:

我有一个名为square 的简单列表:

square = [[1,2,3],[4,5,6],[7,8,9]]

我的目标是遍历九个元素中的每一个,并同时获取该元素的行和列中的所有值。在此示例中,第一次迭代(对于元素 1)应该返回 [1,2,3][1,4,7],第二次(对于元素 2)将返回 [1,2,3][2,5,8],等等。以下代码有效:

for r in range(3):
    for c in range(3):
        row = square[r]
        col = [square[c1][c] for c1 in range(3)]

但是是否有另一种方法使用 base Python 来执行此操作?

我可以使用for c in zip(*square): 对列表进行转置和迭代,如果我只需要列一次,这可以工作,但是没有办法使用数组切片来索引列而不存储矩阵的转置以及矩阵本身?

不幸的是,目前无法选择像 numpy 这样的库,因为它们需要首先通过我们的代码审查流程,这需要很长时间(大约六个月。 ..)。我没有编写政策或设计程序,但这是我必须在这个机构工作的政策。我已经提交了 numpy 的请求,但与此同时,我只是在使用基础 Python。

【问题讨论】:

  • 使用numpy
  • @JBernardo 查看我的编辑。我已经在 numpy 上提出了代码审查过程的请求,但它通常需要 很长 时间,所以同时我希望使用基本 Python 的想法。
  • @MartijnPieters 这意味着我转置数组并保留它的两个副本(原始副本和转置副本),然后遍历它们,对吗?我知道如何转置数组,但由于我已经逐个元素地迭代它,我认为可能还有另一种我不知道的方式。
  • 只要您需要按列访问,只需直接遍历zip(*square)
  • @MartijnPieters 嗯,我必须解决这个问题,因为我需要同时访问每个元素的行和列;我不仅需要获取每列一次。不过,如果我同时遍历 squarezip(*square),那应该是微不足道的。

标签: python python-3.x


【解决方案1】:

如果您想使用标准 Python 执行此操作,您可能需要尝试转置列表。然后,您可以正常索引。您可以使用zip(*square) 后跟map(list,) 将其转回列表:

square = [[1,2,3],[4,5,6],[7,8,9]]

square_transposed = map(list, zip(*square))

然后square[1] 会得到你[2,5,8]

如果您想知道 * 运算符在此上下文中的作用,it unpacks the list to a series of position arguments。所以 zip 看到[1,2,3] [4,5,6] [7,8,9] 并将它们压缩在一起作为[(1, 4, 7), (2, 5, 8), (3, 6, 9)]。然后最终的映射将元组转换为列表。

【讨论】:

  • 基本上,在我索引时只保留两个数据副本?
  • 我不确定还有其他方法。您可能希望创建一个类来为您处理此问题 - 您可以将转换后的版本缓存在同一个对象中,具体取决于内存或速度是您的主要优先事项。
  • 不幸的是,我认为您必须将 map 与另一个 list 通话包装起来。尝试将其作为替代方案:[list(x) for x in zip(*square)].
【解决方案2】:

使用 numpy

>>> import numpy as np
>>> square = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> square[0]
array([1, 2, 3])
>>> square[..., 0]
array([1, 4, 7])
>>> square[:, 0]
array([1, 4, 7])

仅使用 Python

>>> square = [[1,2,3],[4,5,6],[7,8,9]]
>>> square[0]
[1, 2, 3]
>>> zip(*square)[0]
(1, 4, 7)

【讨论】:

  • 我正在焦急地等待我们的代码审查过程结束的那一天,我可以使用它。它似乎比其他选择更容易(而且更 MATLABesque)。不幸的是,numpy 目前不是我的选择。
  • 尽管我的问题不仅仅是转置矩阵,但我最终还是使用了zip(*square),存储了转置,并遍历了每个元素。这不仅仅是转置,因为我同时需要行和列,但我可以将我的小代码 sn-p 添加到答案的底部并接受它,因此基本和 numpy 解决方案在同一个地方。跨度>
猜你喜欢
  • 2021-12-16
  • 2021-12-16
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
相关资源
最近更新 更多