有条件地在Python中平滑/修复列表

时间:2017-02-11 21:31:33

标签: python list

我正在努力平滑Python中的整数列表。我知道如何删除列表中的唯一项目,但我对如何根据特定条件平滑列表感到有点迷失。

我们说我的字符串只包含0 s,12 s。我的目标是检测连续的1 s(1个或多个连续1 s),并且当且仅当侧翼数字相同时才删除它们。我能够编写一个简单的for循环来纠正奇异的1 s,如:

  • 00100可以修复,因此它变为00<0>00(为了清晰起见,修正后的数字为<>。)
  • 00122将无法修复,因为侧翼数字0022不同。例如,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周围的数字不相同0022

注意:字符串不是浮点数/整数 - 它是&#34;调用&#34;的列表。从生物数据中创建,我有意“平滑”#34;它(因为没有更好的词)。

1 个答案:

答案 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}"。)