簡體   English   中英

如果條件為真,則創建具有相鄰列表元素的元組列表

[英]Create a list of tuples with adjacent list elements if a condition is true

我正在嘗試創建一個元組列表,其中元組內容為數字9 ,列表中的數字為前面的數字。

輸入清單:

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

期望的輸出:

sets = [(8, 9), (4, 9), (7, 9)]

碼:

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

目前的結果:

[[], [], []]

更清潔的Pythonic方法:

>>> [(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的條件下進行過濾。 你完成了 :)

您的部分問題是myList[i:i]將始終返回一個空列表。 切片的結尾是獨占的,所以當你執行a_list[0:0]你試圖獲取索引0和索引0 之間存在的a_list元素。

你是在正確的軌道上,但你想要自己壓縮列表。

[(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 ,則抓取相鄰元素。

結果是:

sets
[(8, 9), (4, 9), (7, 9)]

比其他方法效率低,但我決定取消刪除它以向您展示不同的方法。 你可以使用enumerate()代替它:

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

請注意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)]

而:

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

由你來決定哪一個符合你的標准,我只是指出它們在所有情況下的表現都不一樣。

您也可以通過創建迭代器來完成它而不進行切片:

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])

或者使用成對配方來創建配對

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)

如果使用python3,只需導入tee並使用常規zip

令人驚訝的是,沒有人添加功能方法。

另一個替代答案是使用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)]

需要注意的是,只有在python3 +中才需要list調用 本文詳細討論了功能方法和列表推導之間的區別。

我的解決方案類似於Jim的高級零索引檢查

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

[(myList[i-1], x) for i, x in enumerate(myList) if x==9 and i!=0]

# [(8, 9), (4, 9), (7, 9)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM