如果条件为tru,则创建一个包含相邻列表元素的元组列表

2024-03-29 11:37:43 发布

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

我试图创建一个元组列表,其中元组的内容是数字9和列表中它前面的数字。在

输入列表:

myList = [1, 8, 9, 2, 4, 9, 6, 7, 9, 8]

期望输出:

^{pr2}$

代码:

sets = [list(zip(myList[i:i], myList[-1:])) for i in myList if i==9]

当前结果:

[[], [], []]

Tags: 代码in内容列表forifsets数字
3条回答

问题的一部分是myList[i:i]总是返回一个空列表。片的结尾是排他的,所以当你做a_list[0:0]时,你试图获取{}中存在于索引0和索引0之间的元素。在

你是在正确的轨道上,但你想压缩列表本身。在

[(x, y) for x, y in zip(myList, myList[1:]) if y==9]

如果你刚开始的话,我会给你展示一种更直观的替代方法:

sets = [(myList[i-1], myList[i]) for i in range(len(myList)) if myList[i] == 9]

获取列表长度范围内的索引,如果位置i处的值等于9,则获取相邻元素。在

结果是:

^{pr2}$

这比其他方法效率低,但我决定取消删除它,以向您展示一种不同的方法。您可以使用enumerate()来加快速度:

sets = [(myList[i-1], j) for i, j in enumerate(myList) if j == 9]

注意在边缘情况下,myList[0] = 9没有zip的理解行为和有{}的理解行为是不同的。在

具体来说,如果myList = [9, 1, 8, 9, 2, 4, 9, 6, 7, 9, 8],则:

[(myList[i-1], myList[i]) for i in range(len(myList)) if myList[i] == 9]
# results in: [(8, 9), (8, 9), (4, 9), (7, 9)]

同时:

[(x, y) for x, y in zip(myList, myList[1:]) if y==9]
# results in: [(8, 9), (4, 9), (7, 9)]

这取决于你决定哪一个符合你的标准,我只是指出,它们并不是在所有情况下都表现相同。在

更清洁的Python法:

>>> [(x,y) for x,y in zip(myList, myList[1:]) if y == 9]
[(8, 9), (4, 9), (7, 9)]

上面的代码是做什么的:

  • zip(some_list, some_list[1:])将生成相邻元素对的列表。在
  • 现在使用这个元组,在第二个元素等于9的条件下进行过滤。完成:)

相关问题 更多 >