簡體   English   中英

列表中的反向遞增序列

[英]reverse ascending sequences in a list

試圖弄清楚如何在列表中反轉多個升序序列。

例如: input = [1,2,2,3]output = [2,1,3,2]

我使用了mylist.reverse()但當然它反轉為[3,2,2,1] 不確定采取哪種方法?

詳細示例:

因此,可以說[5, 7, 10, 2, 7, 8, 1, 3]是輸入-輸出應為[10,7,5,8,7,2,3,1] 在該示例中,前3個元素5,7,10按升序排列,2,7,8同樣按升序排列,1,3也按升序排列。 該函數應該能夠識別該模式並反轉每個序列並返回一個新列表。

您所需要的只是找到所有非減少的子序列並將其反轉:

In [47]: l = [5, 7, 10, 2, 7, 8, 1, 3]    

In [48]: res = []

In [49]: start_idx = 0

In [50]: for idx in range(max(len(l) - 1, 0)):
    ...:     if l[idx] >= l[idx - 1]:
    ...:         continue
    ...:     step = l[start_idx:idx]
    ...:     step.reverse()
    ...:     res.extend(step)
    ...:     start_idx = idx
    ...:

In [51]: step = l[start_idx:]

In [52]: step.reverse()

In [53]: res.extend(step)

In [54]: print(res)
[10, 7, 5, 8, 7, 2, 3, 1]

if l[idx] >= l[idx - 1]if l[idx] > l[idx - 1]if l[idx] > l[idx - 1]需要更改子序列

有一種更優雅的方法可以做到這一點,但一種方法是使用itertools.zip_longestenumerate來迭代列表中的順序元素對,並跟蹤序列不再提升的每個索引或列表是耗盡,以便切片,反轉和擴展您的輸出列表與切片項目。

from itertools import zip_longest

d = [5, 7, 10, 2, 7, 8, 1, 3]

results = []
stop = None
for i, (a, b) in enumerate(zip_longest(d, d[1:])):
    if not b or b <= a:
        results.extend(d[i:stop:-1])
        stop = i

print(results)
# [10, 7, 5, 8, 7, 2, 3, 1]

走在列表中,從x到y位置創建一個越來越大的窗口。 當您找到下一個數字未提升或到達末尾的位置時,對剛剛覆蓋的窗口進行反向切片並將其添加到輸出列表的末尾:

data = [5, 7, 10, 2, 7, 8, 1, 3]
output = []

x = None
for y in range(len(data)):
  if y == len(data) - 1 or data[y] >= data[y+1]:
    output.extend(data[y:x:-1])
    x = y

print(output)
data = [5, 7, 10, 2, 7, 8, 1, 3,2]
def func(data):
    result =[]
    temp =[]
    data.append(data[-1])
    for i in range(1,len(data)):
        if data[i]>=data[i-1]:
            temp.append(data[i-1])
        else:
            temp.append(data[i-1])
            temp.reverse()
            result.extend(temp)
            temp=[]
    if len(temp)!=0:
        temp.reverse()
        result.extend(temp)
    temp.clear()
    return result

print(func(data))

# output [10, 7, 5, 8, 7, 2, 3, 1, 2] 

您可以定義一個通用的方法 ,它根據條件(謂詞)返回數組的切片。

def slice_when(predicate, iterable):
  i, x, size = 0, 0, len(iterable)
  while i < size-1:
    if predicate(iterable[i], iterable[i+1]):
      yield iterable[x:i+1] 
      x = i + 1
    i += 1
  yield iterable[x:size] 


現在,當下一個元素小於前一個元素時,必須進行切片,例如:

 array = [5, 7, 10, 2, 7, 8, 1, 3] slices = slice_when(lambda x,y: x > y, array) print(list(slices)) #=> [[5, 7, 10], [2, 7, 8], [1, 3]] 

所以你可以像以下一樣簡單地使用它:

 res = [] for e in slice_when(lambda x,y: x > y, array): res.extend(e[::-1] ) res #=> [10, 7, 5, 8, 7, 2, 3, 1] 

暫無
暫無

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

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