假设我有一个这样的字符串列表:
['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']
因此,我意识到,如果我再运行一次“ while循环”,我会得到我想要的(while循环,因为我们不得不提到“ for循环”中循环重复的次数,这不是一种选择) )。但是我不知道这段时间的状况如何。 而且所有这些听起来都有些复杂,所以我想,也许还有其他方法可以实现我想要的目标。因此,这个问题。
注意-这是一个较大的程序的一部分,该程序可从任何未以Python格式编写的布尔表达式中获取真值表。如果解决了这一部分,则可以使用eval解决其余部分。谢谢!!
EDIT1--change是用户定义的函数,用于更改较大字符串的子字符串。
def change(string,old,new):
pos=string.index(old)
return string[:pos]+new+string[pos+1:]
答案 0 :(得分:5)
这是一个使用列表推导的单行代码,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']
答案 1 :(得分:2)
我喜欢kaya3的解决方案,但这是另一个使用正则表达式的解决方案:
>>> import re
>>> [re.sub(r'(\d)(?=\d)', r'\1*', 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']
答案 2 :(得分:2)
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']