假設我不斷生成新資料(例如整數)并希望將它們收集到一個串列中。
import random
lst = []
for _ in range(50):
num = random.randint(0, 10)
lst.append(num)
生成新值時,我希望根據該值的出現次數將其定位在串列中,因此“當前出現”較低的資料應放在“當前出現”較高的資料之前。
“當前發生”是指“到目前為止已經收集到的該資料的重復次數,直到本次迭代”。對于具有相同出現的資料,它們應該遵循它們的生成順序。
例如,如果在第 10 次迭代時,當前串列是[1,2,3,4,2,3,4,3,4],假設1生成了一個新值,那么它應該插入到索引 7 處,結果是[1,2,3,4,2,3,4,1,3,4]。因為它是 的第二次出現1,所以它應該放在所有只出現一次的值之后,但在所有其他出現兩次的現有項之后:2和3(4因此,保持順序)。
這是我當前可以重新排列串列的代碼:
from collections import defaultdict
def rearrange(lst):
d = defaultdict(list)
count = defaultdict(int)
for x in lst:
count[x] = 1
d[count[x]].append(x)
res = []
for k in sorted(d.keys()):
res = d[k]
return res
lst = rearrange(lst)
但是,這并沒有給出我預期的結果。
我撰寫了一個單獨的演算法,該演算法不斷生成新資料,直到滿足某個收斂標準,其中串列有可能變得非常大。
因此,我想即時重新排列我生成的值,即不斷地將資料“就地”插入到串列中。當然,我可以rearrage在每次迭代中使用我的函式,但這會非常低效。我想要做的是將新資料插入串列的正確位置,而不是在每次迭代中用新串列替換它。
有什么建議么?
編輯:資料結構不一定需要是一個串列,但它必須是有序的,并且不需要另一個資料結構來保存資訊。
uj5u.com熱心網友回復:
我認為可能更適合您的目的的資料結構是森林(在這種情況下,是不相交的串列聯合)。
總之,您為每次出現的值保留一個內部串列。當一個新值出現時,您將其添加到串列中,就在您添加該專案的最后一個值之后。
為了跟蹤出現次數,您可以使用內置的Counter.
這是一個示例實作:
from collections import Counter
def rearranged(iterable):
forest, counter = list(), Counter()
for x in iterable:
c = counter[x]
if c == len(forest):
forest.append([x])
else:
forest[c] = [x]
counter[x] = 1
return [x for lst in forest for x in lst]
rearranged([1,2,3,4,2,3,4,3,4,1])
# [1, 2, 3, 4, 2, 3, 4, 1, 3, 4]
為了更好地作業,您的輸入迭代應該是一個生成器(因此可以動態生成專案)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514797.html
