0

我想做一个函数,如果两个字符序列都包含它,它将从两个字符序列中删除“-”。这是我的代码。

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应该被删除。我的代码有什么问题?

4

5 回答 5

4

你想使用or,而不是and...


另一种可以做到这一点的聪明方法是使用运算符链接

if a == b == '-':
   print a,b, 'remove'
else:
   print a,b, 'add'
   x += a
   y += b

这非常简洁明了,只有当破折号出现在两个字符串中时,您才想删除它们。

于 2013-05-30T13:40:12.037 回答
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 == '-')])]

或 using map(),对于 Python 2 来说已经足够了:

def normalized(seq1, seq2):
    return map(''.join, zip(*[(a, b) for a, b in zip(seq1, seq2) if not (a == b == '-')]))
于 2013-05-30T13:39:51.973 回答
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)
于 2013-05-30T13:39:52.087 回答
0

根据您的代码,- u应该删除。

实际上,

a != '-' and b != '-' is False

第一部分是假的,第二部分是真的。假和真就是假。(布尔代数 101,详见http://en.wikipedia.org/wiki/Boolean_algebra#Basic_operations

于 2013-05-30T13:41:03.110 回答
0

您当前要求程序在 a 和 b 不是“-”时进行匹配。这意味着除非两者都不等于“-”,否则它将转到您的 else。你想要的代码是:

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)
于 2013-05-30T13:45:53.880 回答