我撰寫了這個程式來查找字串中某些連續的重復數字并將它們分組。該字串僅包含 0 和 1,我想通過將它們轉換為數字來縮短重復出現的零。此外,為了避免混淆,我將所有的 1 轉換為字母。例如:
item = list("00011101110100010111010001110000")
for i in item:
if i == "1":
item[item.index(i)] = "n"
if i == "0":
index = item.index(i)
zeros = 0
for shft, _ in enumerate(item):
try:
if item[index shft] == "1":
break
if item[index shft] == "0":
item.pop(index shft)
zeros =1
except IndexError:
pass
item.insert(index, zeros)
print(item)
我寫的這個程式的預期輸出是
[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 4]
但我得到的輸出是:
[2, 1, 'n', 'n', 'n', 1, 'n', 'n', 'n', 4, 'n', 1, 'n', 'n', 'n', 'n', 3, 'n', 1, 'n', 'n', 'n', 2, 1, 1]
我四處尋找可以對連續字符進行分組的這種東西,我發現最接近的是這個Java 示例,但我在 python 中實作它時遇到了麻煩。
然后我嘗試了這種方法:
item = img[2]
zeros = 0
for idx, i in enumerate(item):
if i == "0":
zeros = 1
item.pop(idx)
elif i == "1":
item[idx] = "n"
if zeros != 0:
item.insert(idx-1, zeros)
zeros = 0
elif i == "x":
if zeros != 0:
item.insert(idx-1, zeros)
zeros = 0
print(item)
但輸出是:
['0', 2, '1', 'n', 'n', 1, '1', 'n', 'n', '1', '0', '1', 4, '1', 'n', 'n', '1', '0', 3, '1', 'n', 'n', '0', 2, '0', 'x']
誰能告訴我比這更好更快的方法,并告訴我哪里出錯了?
uj5u.com熱心網友回復:
您可以itertools.groupby用于對同一鍵的連續專案進行分組。由于在這種情況下您真的只想將 0 分組而將 1 單獨的專案留下,所以我使用的一個技巧是使用回傳False0 的鍵函式和回傳 1 的遞增數字,這樣 1 就不會被組合在一起作為它們的鍵總是獨一無二的。您可以使用itertools.count來生成這樣的增量數字:
from itertools import groupby, count
item = '00011101110100010111010001110000'
c = count(1)
print([
'n' if k else sum(1 for _ in g)
for k, g in groupby(item, lambda i: i == '1' and next(c))
])
這輸出:
[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 'n', 'n', 4]
uj5u.com熱心網友回復:
您可以使用itertools.groupby嵌套的 for 回圈來決定是使用零的數量還是重復零的數量:
>>> import itertools as it
>>> item = '00011101110100010111010001110000'
>>> [x for k, g in it.groupby(item) for x in (('n' for _ in g) if k == '1' else [sum(1 for _ in g)])]
[3, 'n', 'n', 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 1, 'n', 'n', 'n', 1, 'n', 3, 'n', 'n', 'n', 4]
uj5u.com熱心網友回復:
為什么要在同一個專案物件/變數中輸出?
這是簡單的方法 -
item = list("00011101110100010111010001110000")
output = []
count_zeros = 0
for i in item:
if i == "1":
if count_zeros != 0:
output.append(count_zeros)
output.append("n")
# Set count of zero to 0
count_zeros = 0
elif i == "0":
count_zeros = count_zeros 1
else:
print("This characher is not handled {}".format(i))
print(output)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/483713.html
