如何在满足特定条件的字符串列表中添加子字符串?
How to add substrings within a list of strings following a certain condition?
假设我有一个这样的字符串列表:
['001+11', '010+10', '011+01', '100+11']
我想要这个:
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
我理解这里的条件是每当有 0 或 1 我们必须用数字 +"*" 替换数字,但当数字的下一个元素是 "+" 时不这样做。所以我写了一个python代码如下-
binary=["0","1"]
for string in out:#out is the list of strings
for i in range(len(string)):
if string[i] in binary:
out[out.index(string)]=change(string,string[i],string[i]+"*")
break
print out
这给出输出为-
['0*01+01', '0*00+01', '0*11+00', '0*10+00', '1*01+11', '1*00+11', '1*11+10', '1*10+10']
所以,我意识到如果我 运行 a "while loop" 多几次我会得到我想要的(一个 while 循环,因为我们必须提到 [= 中的循环重复次数30=], 不是这里的选择)。但我无法弄清楚 while 的条件应该是什么。
所有这一切听起来有点复杂,所以我想,也许还有其他方法可以实现我 want.Hence 的问题。
注意--这是一个更大的程序的一部分,用于从任何未写在Python中的布尔表达式中获取真相table format.If这部分已解决,其余部分可能可以提前使用eval.Thanks解决!
EDIT1--change 是一个用户定义的函数,它改变一个更大字符串的子字符串。
def change(string,old,new):
pos=string.index(old)
return string[:pos]+new+string[pos+1:]
这是使用列表推导式的单行代码,join
和 split
完成工作:
>>> lst = ['001+11', '010+10', '011+01', '100+11']
>>> [ '+'.join('*'.join(x) for x in s.split('+')) for s in lst ]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
我喜欢 kaya3 的解决方案,但这是另一个使用正则表达式的解决方案:
>>> import re
>>> [re.sub(r'(\d)(?=\d)', r'*', s) for s in out]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
re.sub('\B', '*', s)
演示:
>>> lst = ['001+11', '010+10', '011+01', '100+11']
>>> [re.sub('\B', '*', s) for s in lst]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
假设我有一个这样的字符串列表:
['001+11', '010+10', '011+01', '100+11']
我想要这个:
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
我理解这里的条件是每当有 0 或 1 我们必须用数字 +"*" 替换数字,但当数字的下一个元素是 "+" 时不这样做。所以我写了一个python代码如下-
binary=["0","1"]
for string in out:#out is the list of strings
for i in range(len(string)):
if string[i] in binary:
out[out.index(string)]=change(string,string[i],string[i]+"*")
break
print out
这给出输出为-
['0*01+01', '0*00+01', '0*11+00', '0*10+00', '1*01+11', '1*00+11', '1*11+10', '1*10+10']
所以,我意识到如果我 运行 a "while loop" 多几次我会得到我想要的(一个 while 循环,因为我们必须提到 [= 中的循环重复次数30=], 不是这里的选择)。但我无法弄清楚 while 的条件应该是什么。 所有这一切听起来有点复杂,所以我想,也许还有其他方法可以实现我 want.Hence 的问题。
注意--这是一个更大的程序的一部分,用于从任何未写在Python中的布尔表达式中获取真相table format.If这部分已解决,其余部分可能可以提前使用eval.Thanks解决!
EDIT1--change 是一个用户定义的函数,它改变一个更大字符串的子字符串。
def change(string,old,new):
pos=string.index(old)
return string[:pos]+new+string[pos+1:]
这是使用列表推导式的单行代码,join
和 split
完成工作:
>>> lst = ['001+11', '010+10', '011+01', '100+11']
>>> [ '+'.join('*'.join(x) for x in s.split('+')) for s in lst ]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
我喜欢 kaya3 的解决方案,但这是另一个使用正则表达式的解决方案:
>>> import re
>>> [re.sub(r'(\d)(?=\d)', r'*', s) for s in out]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']
re.sub('\B', '*', s)
演示:
>>> lst = ['001+11', '010+10', '011+01', '100+11']
>>> [re.sub('\B', '*', s) for s in lst]
['0*0*1+1*1', '0*1*0+1*0', '0*1*1+0*1', '1*0*0+1*1']