找到列表中剩余的最大和第二大数字

时间:2019-08-06 23:03:17

标签: python list recursion

我有三个列表:wordoccurrencealphabet

occurrence = [2, 1, 3, 10] # but can be initialized differently
k = len(occurrence)
alphabet = [range(k)]
N = sum(occurrence)
word = [0]*N # initially

word是一个列表,其中将包含alphabet所确定的从occurrence中提取的值的特定组合。在上面的示例中,word必须包含两个0,一个1,三个2和十个3的某种组合。 alphabet可用于索引occurrence

我有一种算法(see List-Fixed-Content by Sawada),可以将alphabet中的“字母”递归添加到word中或从中删除,从而减小occurrence的相应索引中的值添加字母时,删除字母时增加该值。

该算法从最高字母开始(在这种情况下首次初始化时为3),其中occurrence中的对应索引仍大于零,然后随着算法的进行,移至下一个最高位仍大于零的字母。

我目前正在处理此问题,方法是在letter出现时通过word.remove(letter)删除word.insert(i,letter),然后在出现次数再次增加时使用alphabet将其重新添加到正确的位置。这使得在occurrence = [2, 5, 3, 5] # example occurrence k = len(occurrence) alphabet = [range(k)] N = sum(occurrence) word = [0]*N def algorithm(t, p): if t > N: if N % p == 0: yield word.copy() else: letter = max(alphabet) i = len(alphabet)-1 while letter >= word[t-p-1]: word[t-1] = letter occurrence[letter] -= 1 if not occurrence[letter]: # <<<< i_removed = remove(letter) if letter == word[t-p-1]: yield from algorithm(t+1, p) else: yield from algorithm(t+1, t) if not occurrence[letter]: # <<<< add(i_removed, letter) occurrence[letter] += 1 i -= 1 letter = get(i) # <<<< def remove(letter): i = alphabet.index(letter) alphabet.remove(letter) return i def add(i, letter): alphabet.insert(i,letter) def get(i): if i < 0: return -1 else: return alphabet[i] def execute() yield from algorithm(1, 1) # Example usage of function print(list(execute())) 降级字母中找到最大值非常容易。

要求的完整代码:

list.insert

我发现这非常慢,我怀疑是由于alphabet造成的。查找occurrence中对应值非零的alphabet的最高字母和次高字母的更好方法是什么,而无需从... letter = max(alphabet[occurrence > 0]) while letter >= limit: # some limit ... while True: # <<<< replaces remove(), add(), and get() letter -= 1 if letter < 0 or occurrence[letter] > 0: break 添加和删除字母?

类似于将列表分配为numpy数组和以下代码?

"expo": "^32.0.0"

0 个答案:

没有答案