【问题标题】:How to use and operator in python?如何在python中使用和运算符?
【发布时间】:2013-05-30 13:34:06
【问题描述】:

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

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

【问题讨论】:

  • 但是- b 应该被删除吗?
  • 你的缩进坏了,能修好吗?

标签: python conditional operator-keyword


【解决方案1】:

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


另一种巧妙的方法是使用operator chaining

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

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

【讨论】:

  • @GrijeshChauhan 相当于(a ==b and b == '-')
  • 它被称为操作符链,正如 mgilson 所写,它是 python 的一个特性 ;-) 你也可以使用 5 < x < 10 而不是 x > 5 and x < 10 等。
  • 记录在案here
  • @AshwiniChaudhary, Septi, mgilsom ..nice feature.. 它不会发生在我们的 C 中:)
【解决方案2】:

如果您只想删除 两者 都是 -,那么测试一下:

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 == '-')]))

【讨论】:

  • 德摩根定律在@mgilson 回答中简化了这一点。
  • if not a == b == '-':
  • 这个if not (a == b == '-'): 有效。我只是想念这里的逻辑:p 感谢您减少代码:D
  • @user2435611:如果ab 都等于-,则括号中的部分只有Truenot 只是将其转换为 a 不等于 b,或者如果它们至少不等于 -
  • 是的,您的代码正是我想要做的,您只需将其缩减为 2 行 :D 非常感谢
【解决方案3】:

条件应该是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)

【讨论】:

    【解决方案4】:

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

    其实

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

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

    【讨论】:

      【解决方案5】:

      您当前要求程序在 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)
      

      【讨论】:

      • 打印时为什么要添加'remove'? :-)
      • 哎呀,那是一段可怕的代码,但是是的,添加还在其他地方。我现在将对其进行编辑。
      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2021-09-30
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多