迭代地收集矩阵每个向量的前两个元素

2024-04-26 06:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个矩阵:

matrix = [['F', 'B', 'F', 'A', 'C', 'F'],
          ['D', 'E', 'B', 'E', 'B', 'E'],
          ['F', 'A', 'D', 'B', 'F', 'B'],
          ['B', 'E', 'F', 'B', 'D', 'D']]

我想删除和收集每个子列表的前两个元素,并将它们添加到新列表中。你知道吗

到目前为止,我得到了:

while messagecypher:
    for vector in messagecypher:
        final.extend(vector[:2])

问题是,slice似乎没有删除元素,我最终得到了一个庞大的重复字符列表。我可以用.pop(0)两次,但那不是很干净。你知道吗

注意:我删除元素的原因是因为我需要继续遍历每个向量,直到矩阵为空


Tags: in元素列表forslice原因矩阵字符
3条回答

您可以保留slice并执行以下操作:

final = []
for i in range(len(matrix)):
    matrix[i], final = matrix[i][:2], final + matrix[i][2:]

注意,这同时将切片列表分配回matrix,并将切片部分添加到final。你知道吗

删除元素不是执行任务的有效方法。它需要Python执行大量不必要的工作来改变东西,以填补被删除元素留下的漏洞。相反,每次在循环中只需将切片移动两个位置:

final = []
for i in xrange(0, len(messagecypher[0]), 2):
    for vector in messagecypher:
        final.extend(vector[i:i+2])

好吧,你可以用列表理解来完成这件事,但这可能违反直觉:

>>> matrix = [['F', 'B', 'F', 'A', 'C', 'F'],
          ['D', 'E', 'B', 'E', 'B', 'E'],
          ['F', 'A', 'D', 'B', 'F', 'B'],
          ['B', 'E', 'F', 'B', 'D', 'D']]
>>> while [] not in matrix: print([i for var in matrix for i in [var.pop(0), var.pop(0)]])
['F', 'B', 'D', 'E', 'F', 'A', 'B', 'E']
['F', 'A', 'B', 'E', 'D', 'B', 'F', 'B']
['C', 'F', 'B', 'E', 'F', 'B', 'D', 'D']

编辑:

使用range使语法看起来更清晰:

>>> matrix = [['C', 'B', 'B', 'D', 'F', 'B'], ['D', 'B', 'B', 'A', 'B', 'A'], ['B', 'D', 'E', 'F', 'C', 'B'], ['B', 'A', 'C', 'B', 'E', 'F']] 
>>> while [] not in matrix: print([var.pop(0) for var in matrix for i in range(2)])
['C', 'B', 'D', 'B', 'B', 'D', 'B', 'A']
['B', 'D', 'B', 'A', 'E', 'F', 'C', 'B']
['F', 'B', 'B', 'A', 'C', 'B', 'E', 'F']

相关问题 更多 >

    热门问题