![](/img/trans.png)
[英]Collect elements from a list of lists based on the first elements of each group
[英]Iteratively collect first two elements of each vector of a matrix
我有一个矩阵:
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)
两次,但这不是很干净。
注意:我删除元素的原因是因为我需要继续遍历每个向量,直到矩阵为空
你可以让你的slice
,做:
final = []
for i in range(len(matrix)):
matrix[i], final = matrix[i][:2], final + matrix[i][2:]
请注意,这会同时将切片列表分配回matrix
,并将切片部分添加到final
。
好吧,您可以使用列表理解来完成任务,但是这可能与直觉相反:
>>> 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']
删除元素不是执行任务的有效方法。 它要求Python执行大量不必要的工作来转移内容,以填补已删除元素留下的漏洞。 取而代之的是,每次在循环中将您的切片每次移动两个位置:
final = []
for i in xrange(0, len(messagecypher[0]), 2):
for vector in messagecypher:
final.extend(vector[i:i+2])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.