我想创建一个函数,如果两个char都包含它,它将从两个char序列中删除' - '。这是我的代码。
def normalized(seq1, seq2):
x = ''
y = ''
for a, b in zip(seq1, seq2):
if a != '-' and b != '-':
print a,b, 'add'
x += a
y += b
else:
print a, b, 'remove'
return x,y
x = 'ab--dfd--df'
y = 'rt-bfdsu-vf'
print normalized(x, y)
这就是结果。
a r add
b t add
- - remove
- b remove
d f add
f d add
d s add
**- u remove**
- - remove
d v add
f f add
('abdfddf', 'rtfdsvf')
您可以看到不应删除-
和u
。我的代码出了什么问题?
答案 0 :(得分:4)
您想使用or
,而不是and
...
另一种聪明的方法是使用operator chaining:
if a == b == '-':
print a,b, 'remove'
else:
print a,b, 'add'
x += a
y += b
这非常简洁明了,只有当它们出现在两个字符串中时才要删除短划线。
答案 1 :(得分:3)
如果你只想删除两个都是-
,那么请测试一下:
if not (a == '-' and b == '-'):
可以缩短为:
if not (a == b == '-'):
或使用or
代替and
删除not
:
if a != '-' or b != '-':
但这不是可读的。
也许没有更多的可读性,但列表理解将是:
def normalized(seq1, seq2):
return [''.join(v) for v in zip(*[(a, b)
for a, b in zip(seq1, seq2) if not (a == b == '-')])]
或使用map()
,足以支持Python 2:
def normalized(seq1, seq2):
return map(''.join, zip(*[(a, b) for a, b in zip(seq1, seq2) if not (a == b == '-')]))
答案 2 :(得分:1)
条件应为not (a =='-' and b == '-')
:
def normalized(seq1, seq2):
x = ''
y = ''
for a, b in zip(seq1, seq2):
if not (a =='-' and b == '-'): # you need `not` here
print a,b, 'add'
x += a
y += b
else:
print a, b, 'remove'
return x,y
x = 'ab--dfd--df'
y = 'rt-bfdsu-vf'
print normalized(x, y)
答案 3 :(得分:0)
根据您的代码,- u
应该删除。
事实上,
a != '-' and b != '-' is False
第一部分是假的,第二部分是真的。假和真是假的。 (布尔代数101,详见http://en.wikipedia.org/wiki/Boolean_algebra#Basic_operations)
答案 4 :(得分:0)
当a和b不是“ - ”时,您当前要求程序匹配。这意味着,除非两者不等于“ - ”,否则它将转到您的其他地方。你想要的代码是:
def normalized(seq1, seq2):
x = ''
y = ''
for a, b in zip(seq1, seq2):
if a == '-' and b == '-':
print a,b, 'remove'
else:
print a, b, 'add'
x += a
y += b
return x,y
x = 'ab--dfd--df'
y = 'rt-bfdsu-vf'
print normalized(x, y)