我有一個 Python 串列
num_list = list(range(1,33))
并且需要串列中的每一對數字,如下所示:
[1, 2, 5, 6, 9, 10 ... ]
我已經想出了如何從串列中排除某些索引,就像這樣
num_list[2::3]
> [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
但還沒有弄清楚如何讓它一次捕獲兩個索引。
uj5u.com熱心網友回復:
您可以使用enumerate, 然后以數學方式過濾索引:
[v for i, v in enumerate(num_list) if i % 4 < 2]
uj5u.com熱心網友回復:
使用串列理解的另一種解決方案應該適用于您的特殊情況
[v for vals in zip(num_list[::4],num_list[1::4]) for v in vals]
uj5u.com熱心網友回復:
sorted(num_list[0::4] num_list[1::4])
uj5u.com熱心網友回復:
你不能只用一個切片操作來做到這一點。你可以做類似的事情
[num_list[j] for i in range(0, len(num_list), 4) for j in (i, i 1)]
編輯:另一種選擇是:
[x for i in range(0, len(num_list), 4) for x in num_list[i:i 2]]
還有另一個(懶惰的)選擇是
def keep_two_skip_two(it):
it = iter(it)
try:
while True:
yield next(it)
yield next(it)
next(it)
next(it)
except StopIteration:
return
list(keep_two_skip_two(num_list))
uj5u.com熱心網友回復:
你可以根據你的模式看起來更通用一些。您可以應用掩碼,而不是使用基于索引的條件。例如
mask = [1, 1, 0, 0]
要創建值重復的掩碼,使其與資料的長度相同,您可以zip將資料放在itertools.cycle(m). 例子:
import itertools
def filter_mask(data, mask):
return [d for d, m in zip(data, itertools.cycle(mask)) if m]
或者按照@KellyBundy 的建議使用 compress !
def filter_mask(data, mask):
return list(itertools.compress(data, itertools.cycle(mask)))
例子
>>> data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> filter_mask(data, mask=[1, 0])
[0, 2, 4, 6, 8, 10]
>>> filter_mask(data, mask=[0, 1])
[1, 3, 5, 7, 9]
>>> filter_mask(data, mask=[1, 1, 0, 0])
[0, 1, 4, 5, 8, 9]
>>> filter_mask(data, mask=[1, 0, 1, 1, 0])
[0, 2, 3, 5, 7, 8, 10]
uj5u.com熱心網友回復:
解決方案 1:使用兩個排除項:
del num_list[2::4]
del num_list[2::3]
現在你的清單是:
[1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30]
解決方案 2:使用compressand cyclefrom itertools:
list(compress(num_list, cycle([True, True, False, False]))))
較短的版本:
[*compress(num_list, cycle([1, 1, 0, 0]))]
uj5u.com熱心網友回復:
range對兩個生成器使用不同的物件:
>>> [x for i in range(1,33,4) for x in range(i, i 2)]
[1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30]
僅按需生成 2 元素范圍的惰性版本:
>>> from itertools import chain
>>> x = chain.from_iterable(range(i, i 2) for i in range(1,33,4))
>>> list(x)
[1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30]
uj5u.com熱心網友回復:
這是一種在切片串列上使用itertools.chain.from_iterable以及實作此目的的功能方法:zip
>>> num_list = list(range(1,33))
>>> from itertools import chain
>>> list(chain.from_iterable(zip(num_list[::4], num_list[1::4])))
[1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30]
uj5u.com熱心網友回復:
這是一種解決方案:
num_list = list(range(1,33))
i=0
j=0
new_list = []
for num in num_list:
i =1
if i == 3:
i = 2
j =1
if j == 2:
j=0
i=0
continue
new_list.append(num)
print(new_list)
輸出:
[1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30]
這將遍歷串列并在每 2 個專案后跳過 2 個專案。
像這樣展開后可能更容易閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406118.html
標籤:
