我正在努力平滑Python中的整数列表。我知道如何删除列表中的唯一项目,但我对如何根据特定条件平滑列表感到有点迷失。
我们说我的字符串只包含0
s,1
和2
s。我的目标是检测连续的1
s(1个或多个连续1
s),并且当且仅当侧翼数字相同时才删除它们。我能够编写一个简单的for循环来纠正奇异的1
s,如:
00100
可以修复,因此它变为00<0>00
(为了清晰起见,修正后的数字为<>
。)00122
将无法修复,因为侧翼数字00
和22
不同。例如,00120
也是如此。我可以简单地使用以下逻辑来修复&#34;通过查看1
之前和之后的2位数字:
# Example string
string = '000010000'
_string = list(string)
# For loop
# Skipping the first 2 and last 2...
# because there is insufficient information
for i in range(2, len(string)-2):
# Store the 2 digits before and after
flanking = string[i-2:i] + string[i+1:i+3]
# If flanking contains one unique value...
# then we can fix it
if len(set(flanking)) == 1:
_string[i] = flanking[0]
print(string) # Original string
print(''.join(_string)) # "Fixed" string
然而,在尝试做同样的事情时,我遇到了一个心灵障碍,因为连续 1
:
0011111100
,使其显示为00<000000>00
(再次添加<>
仅为了清楚显示已替换的数字)0011111122
不应修复,因为连续111111
周围的数字不相同00
与22
。注意:字符串不是浮点数/整数 - 它是&#34;调用&#34;的列表。从生物数据中创建,我有意“平滑”#34;它(因为没有更好的词)。
答案 0 :(得分:2)
我的解决方案使用正则表达式和re.sub
使用替换函数(包装在循环中以测试案例):
import re
for s in ["2211111122","001111100","001111122"]:
print(re.sub(r"([02-9])(1+)\1",lambda m: "{0}<{1}>{0}".format(m.group(1),"0"*len(m.group(2))),s))
结果:
22<000000>22
00<00000>00
001111122
2个第一个字符串发生替换,但最后一个字符串不发生,因为侧翼数字不同。
它是如何工作的:它只是寻找1s包裹但1位不同于1(左右相同,使用\1
引用),并调用一个函数,用一组替换1组0的长度完全相同(包含<>
。如果您不需要,请将"{0}<{1}>{0}"
替换为"{0}{1}{0}"
。)