如果条件为真,则创建具有相邻列表元素的元组列表

29 python tuples list-comprehension list python-3.x

我正在尝试创建一个元组列表,其中元组内容是列表中的数字9和数字.

输入清单:

myList = [1, 8, 9, 2, 4, 9, 6, 7, 9, 8]
Run Code Online (Sandbox Code Playgroud)

期望的输出:

sets = [(8, 9), (4, 9), (7, 9)]
Run Code Online (Sandbox Code Playgroud)

码:

sets = [list(zip(myList[i:i], myList[-1:])) for i in myList if i==9]
Run Code Online (Sandbox Code Playgroud)

目前的结果:

[[], [], []]
Run Code Online (Sandbox Code Playgroud)

Ult*_*nct 40

更清洁的Pythonic方法:

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

上面的代码是做什么的:

  • zip(some_list, some_list[1:]) 会生成一对相邻元素的列表.
  • 现在使用该元组,过滤第二个元素等于的条件9.你完成了 :)


Mor*_*app 17

您的部分问题是myList[i:i]始终返回一个空列表.切片的结尾是独占的,所以当你a_list[0:0]尝试将索引0和索引0 之间的元素a_list存在时.

你是在正确的轨道上,但你想要自己压缩列表.

[(x, y) for x, y in zip(myList, myList[1:]) if y==9]
Run Code Online (Sandbox Code Playgroud)

  • @SuperSaiyan除了你没有提到OP的主要问题,他们使用`myList [i:i]`. (7认同)

Jim*_*ard 7

你非常接近,如果你刚刚开始,我会告诉你另一种可能更直观的方式:

sets = [(myList[i-1], myList[i]) for i in range(len(myList)) if myList[i] == 9]
Run Code Online (Sandbox Code Playgroud)

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

结果是:

sets
[(8, 9), (4, 9), (7, 9)]
Run Code Online (Sandbox Code Playgroud)

比其他方法效率低,但我决定取消删除它以向您展示不同的方法.您可以使用以下代码enumerate()来提高速度:

sets = [(myList[i-1], j) for i, j in enumerate(myList) if j == 9]
Run Code Online (Sandbox Code Playgroud)

请注意,在边缘情况下,myList[0] = 9理解zip的行为没有和理解的行为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)]
Run Code Online (Sandbox Code Playgroud)

而:

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

由你来决定哪一个符合你的标准,我只是指出它们在所有情况下的表现都不一样.


Pad*_*ham 5

您也可以通过创建迭代器来完成它而不进行切片:

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

it1, it2 = iter(l), iter(l)
# consume first element from it2 -> leaving 8,9,2,4,9,6,7,9,8
next(it2, "")
# then pair up, (1,8), (8,9) ...
print([(i, j) for i,j in zip(it1, it2) if j == 9])
Run Code Online (Sandbox Code Playgroud)

或者使用成对配方来创建配对

from itertools import tee, izip

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
Run Code Online (Sandbox Code Playgroud)

如果使用python3,只需导入tee并使用常规zip.


Bha*_*Rao 5

令人惊讶的是,没有人添加功能方法.

另一个替代答案是使用a filter.这个内置函数返回一个迭代器(Python2中的列表),该迭代器包含列表中存在的所有返回True特定函数的元素

>>> myList = [1,8,9,2,4,9,6,7,9,8]
>>> list(filter(lambda x:x[1]==9,zip(myList, myList[1:])))
[(8, 9), (4, 9), (7, 9)]
Run Code Online (Sandbox Code Playgroud)

需要注意的list是,只有在python3 +中才需要调用.本文详细讨论了功能方法和列表推导之间的区别.