串列僅包含整數。我需要選擇具有下一個要求的元素(每個要求都是一個單獨的問題):
1 和 1 之間的元素:
[2,1,3,1,3] -> [3],[2,1,3,4,1,3] -> [3,4]相同數字之間的元素:a) 只允許一對相同的數字:
[1,2,3,2] -> [3] (2 and 2), [1,4,3,5,4] -> [3,5], (4 and 4)b) 允許多對:[1,2,1,2] -> [[2],[1]], (pairs of: (1,1),(2,2)); [1,4,3,5,4,3,2] -> [[3,5],[5,4], (pairs of: (4,4), (3,3))具有多個相同鄰域的元素:
[1,1,3] -> [1,1], (2 consecutive 1s), [1,1,3,2,2,2,1] -> [1,1,2,2,2] (2 consecutive 1s and 3 consecutive 2s)
這個問題的一般方法是什么?我使用過過濾器,但只使用了一個引數謂詞:filter(lambda x: (x%2 == 0), numbers)
是否有另一種方法而不是嵌套 for 回圈?也許更實用的風格。是否可以使用卷積作為解決方案?
uj5u.com熱心網友回復:
對于 Q1,您可以創建一個索引為 1 的串列,然后再次遍歷該串列以查找兩個項之間的項。
ones = [i for i,x in enumerate(lst) if x==1]
for i,j in zip(ones, ones[1:]):
print(lst[i 1:j])
輸出:
[2,1,3,1,3] -> [3]
[2,1,3,4,1,3] -> [3, 4]
對于 Q2,與 Q1 類似,遍歷串列以查找專案的索引并將它們保存在字典中。然后迭代它以找到出現多次的數字并列印出這些數字之間的專案:
d = {}
for i,x in enumerate(lst):
d.setdefault(x, []).append(i)
for k,indices in d.items():
if len(indices)>1:
for i,j in zip(indices, indices[1:]):
print(lst[i 1:j])
輸出:
[1,2,3,2] -> [3]
[1,4,3,5,4] -> [3, 5]
uj5u.com熱心網友回復:
這是itertools使用經典回圈的Q1/Q3和 Q2的解決方案:
第一季度
這個分組等于 1,然后洗掉第一個和最后一個組(要么是 1,要么不是 1,但無論如何我們不想保留),然后洗掉等于 1 的組,只留下內部組是 any。
l1 = [2,1,3,4,1,3,6,1,0]
from itertools import groupby, chain
list(chain.from_iterable(g for k,g in
[(k,list(g)) for k,g in
groupby(l1, lambda x: x==1)][1:-1]
if not k))
# [3, 4, 3, 6]
第三季度
這里我們按相同的連續值分組,如果大于 1,則使用組長度進行過濾。
注意。如果一個值出現超過 2 次,將會有副作用,在這種情況下,應該明確預期的行為
l3 = [1,1,3,2,2,2,1]
from itertools import groupby, chain
list(chain.from_iterable(l for k,g in groupby(l3) if len(l:=list(g))>1))
# [1, 1, 2, 2, 2]
Q2
對于這個,我們首先閱讀串列以識別重復值。然后我們再次讀取串列,并在遇到一次鍵后將值添加到以重復項作為鍵的串列字典中。
l2 = [1,4,3,5,4,3,2]
from collections import Counter
dups = {k: [] for k,v in Counter(l2).items() if v>1}
active = set()
for i in l2:
if i in dups: # if many keys are expected initialize and use a set of the keys to improve efficiency
active.remove(i) if i in active else active.add(i)
for k in active:
if i != k:
dups[k].append(i)
list(dups.values())
# [[3, 5], [5, 4]]
uj5u.com熱心網友回復:
第 3 部分無需使用嵌套 for 回圈即可解決 itertools.groupby
from itertools import groupby
def repeating_sections(lst):
out_lst = []
for key, group in groupby(lst):
_lst = list(group)
if len(_lst) > 1:
out_lst = _lst
return out_lst
print(repeating_sections([1, 1, 3, 2, 2, 2, 1])
# [1, 1, 2, 2, 2]
uj5u.com熱心網友回復:
也許你可以創建一個函式?它滿足所有三個標準
def filterNumbers(numList, targetNum) -> list:
firstPosition = numList.index(targetNum)
lastPosition = numList.index(targetNum, firstPosition 2)
while True:
try:
if lastPosition != (len(numList)-1):
if numList[lastPosition] == numList[lastPosition 1]:
lastPosition = lastPosition 1
continue
break
except Exception as e:
print(e)
resultList = numList[firstPosition 1:lastPosition]
return resultList
條件 1:
test1 = [2, 1, 3, 1, 3]
filterNumbers(test1, 1)
#Output:
[3]
條件 2:
test2 = [1, 4, 3, 5, 4]
filterNumbers(test2, 4)
#Output:
[3, 5]
條件 3:
test3 = [1,1,3,2,2,2,1]
filterNumbers(test3, 1)
#Output
[1, 3, 2, 2, 2]
我假設你在寫第三個條件時有一個錯字,因為你跳過了 3 并包含了第一個 1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399269.html
下一篇:獲取串列中的元素范圍并交換
