monets = []
for i in range(20):
choices = ['Tails', 'Eagle']
monets.append(random.choice(choices))
cnt = 0
prev = 0
for i, e in enumerate(monets):
if e == 'Eagle':
cnt = 1
if e == 'Eagle' and i == len(monets) - 1 and cnt > prev:
prev = cnt
elif e != 'Eagle':
if prev < cnt:
prev = cnt
cnt = 0
print(monets)
print(prev)
我的代碼在隨機生成的串列中計算“Eagle”的最大序列,但我堅持如何計算該序列的第一個和最后一個索引。我發現使用 enumerate 可能會對我有所幫助,但我搞混了。示例:['Tails','Eagle','Eagle','Tails','Eagle'] => 輸出:1,2
uj5u.com熱心網友回復:
這應該可行,這是一個簡單的演算法,您不需要任何復雜的庫:
(修訂版 2)
m = 0
c = 0
p = -1
for [i,s] in enumerate(monets):
if s == 'Eagle':
c = 1
else:
c = 0
if c > m:
m = c
p = i
print('max Eagle:', m, 'from:', p 1 - m, 'to:', p)
uj5u.com熱心網友回復:
您還可以itertools.groupby用來獲取連續的“老鷹”組。將其與 結合起來enumerate,就像您的方法一樣,將它們與索引配對,并用于max查找最長的序列。最后,從該串列的第一個和最后一個元素中獲取索引。
>>> from itertools import groupby
>>> monets = ['Tails', 'Eagle','Eagle','Tails','Eagle']
>>> max((list(g) for k, g in groupby(enumerate(monets), key=lambda x: x[1]) if k == "Eagle"), key=len)
[(1, 'Eagle'), (2, 'Eagle')]
>>> _[0][0], _[-1][0]
(1, 2)
uj5u.com熱心網友回復:
只是閱讀您的代碼,看起來您已經進行了以下計算(即通常是正確的,但我實際上并沒有運行和測驗錯誤)
['Tails', 'Eagle','Eagle','Tails','Eagle'] # monets list
[ 0, 1, 2, 0, 1] # 'Eagle' sequence lengths
有幾種不同的方法可以做你想做的事,但繼續你現有的方法,你確實可以enumerate用來生成以下內容:
[ (0, 0), (1, 1), (2, 2), (3, 0), (4, 1)] # seq lengths from before, enumerated
其中每一對代表:(index, length)
從那里,找到長度最大的對,你將得到序列的結束索引,在這種情況下:(2, 2)。
的第一個實體length == 1,從結束索引向后搜索,將為您提供起始索引。
旁注:@tobias_k 的答案是以更實用的風格撰寫的(我個人也更喜歡這種風格)。這是一種不同于您開始使用的方法,但我強烈建議您學習它。這是寫得更多(IMO)可讀的方法:
import itertools as it
monets = ['Tails', 'Eagle','Eagle','Tails','Eagle']
grouped = it.groupby(enumerate(monets), key=lambda pair: pair[1])
eagle_seqs = [list(seq) for v, seq in grouped if v == 'Eagle']
longest_seq = max(eagle_seqs, key=len)
seq_idxs = [i for i, _ in longest_seq]
start_idx, end_idx = seq_idxs[0], seq_idxs[-1]
uj5u.com熱心網友回復:
這是解決這個問題的最優雅的解決方案:
import random
import numpy as np
import pandas as pd
monets = []
for i in range(20):
choices = ['Tails', 'Eagle']
monets.append(random.choice(choices))
這里唯一要做的就是將 seq 編碼為 num 個值并找到最長的連續索引序列:
encode_ = {'Tails': 0, 'Eagle': 1}
df = pd.DataFrame(monets).replace(encode_)
A = np.where(df == 1)[0]
result = max(np.split(A, np.where(np.diff(A) != 1)[0] 1), key=len).tolist()
start_idx, end_idx = result[0],result[-1]
uj5u.com熱心網友回復:
使用落地方法:(它回傳連續項的第一個最大序列的位置)
lst = ['Tails', 'Eagle', 'Eagle','Tails', 'Eagle', 'Eagle','Eagle', 'Eagle', 'Tails', 'Eagle', 'Eagle','Tails']
index, counter = -1, 0
tmp_i, tmp_c = -1, 0
for i, v in enumerate(lst):
if v == 'Eagle':
# tmp-update
tmp_c = 1
if tmp_i == -1:
tmp_i = i
else:
if tmp_c > counter:
# global update
counter = tmp_c
index = tmp_i
# reset
tmp_i, tmp_c = -1, 0
# final check for occurrence of max sequence at the end of the list
if tmp_c > counter:
# global update
counter = tmp_c
index = tmp_i
boundaries_max_seq = (index, index counter - 1)
print(boundaries_max_seq)
# (4, 7)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/486719.html
