我正在嘗試獲取一個數字,將其轉換為二進制,然后生成一個類似術語長度的串列。
例如,n=49 以二進制表示為"110001"。我想回傳一個長度為 的串列["11", "000", "1"],即[2, 3, 1]。
到目前為止,我可以使用將數字轉換為二進制,"{0:b}".format(n)但我不能對類似的術語進行分組。
uj5u.com熱心網友回復:
您可以itertools.groupby按如下方式用于此任務
import itertools
t = "110001"
lengths = [len(list(g)) for k,g in itertools.groupby(t)]
print(lengths)
輸出
[2, 3, 1]
itertools.groupby確實找到了連續相同元素的運行(除非給出第二個引數),g這是用于創建list測量長度的迭代器。觀察你做不到len(g)。
uj5u.com熱心網友回復:
你可以這樣做:
from itertools import groupby
def binary_chunks(n: int) -> list:
return [len("".join(g)) for _, g in groupby(f"{n:b}")]
例如:
>>> binary_chunks(49) # binary: 110001
>>> [2, 3, 1]
>>> binary_chunks(4) # binary: 100
>>> [1, 2]
>>> binary_chunks(123456789) # binary: 111010110111100110100010101
>>> [3, 1, 1, 1, 2, 1, 4, 2, 2, 1, 1, 3, 1, 1, 1, 1, 1]
timeit如果您有興趣,我還進行了測驗:
>>> %timeit binary_chunks(49)
>>> 2.28 μs ± 208 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
uj5u.com熱心網友回復:
你可以在轉換你的號碼后使用它(小心,它應該是字串):
from itertools import groupby
bin_number = "110001"
result = ["".join(group) for ele, group in groupby(bin_number)]
print(result)
輸出:
["11", "000", "1"]
uj5u.com熱心網友回復:
你也可以用這個re包解決這個問題:
import re
def bit_run_lengths(n, pat=re.compile('1 |0 ')):
return [
len(m)
for m in pat.findall(bin(n)[2:])
]
根據我的基準測驗,這大約是解決方案的兩倍itertools.groupby。
對于更通用的(單字符)運行長度轉換器,您可以使用反向參考。(這是可以安全使用反向參考的罕見情況。)它的速度稍慢,但仍略勝一籌groupby:
def run_length(s, pat=re.compile(r'((.)\2*)')):
return [len(m[0]) for m in pat.findall(s)]
>>> run_length("aabbbbbbbzxxaaa")
[('a', 2), ('b', 7), ('z', 1), ('x', 2), ('a', 3)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486313.html
標籤:Python python-3.x 列表 算法
上一篇:SUMO-添加車輛的出發和到達邊緣并使用Dijkstra演算法找到最短路徑
下一篇:從集合中洗掉串列中存在的專案-流
