19

論理的な含意を持つステートメントを python で書きたいと思います。何かのようなもの:

if x => y:
  do_sth()

もちろん、私は使用できることを知っています:

if (x and y) or not x:
  do_sth()

しかし、Pythonでこれに対する論理演算子はありますか?

4

8 に答える 8

31

p => qは と同じなのでnot(p) or q、試してみてください。

于 2013-05-06T19:37:33.827 に答える
13

面白いからといって、 x => y はbool(x) <= bool(y)python にある可能性があります。

于 2015-10-07T15:27:44.073 に答える
7

逆の含意演算子があります。

if y ** x:
  do_sth()

y が x によって暗示されている場合。

https://github.com/cosmologicon/pywatへのクレジット

于 2015-11-17T23:04:35.943 に答える
6

あなたの質問は、Python にこれに対する単一の論理演算子があるかどうかを尋ねます。簡単な答えは「いいえ」です。ドキュメントにはブール演算がリストされており、Python にはそのようなものはありません。

明らかに、Juampiの回答が指摘しているように、少し短い論理的に同等の操作がありますが、あなたが尋ねたような単一の演算子はありません。

于 2013-05-06T19:38:34.830 に答える
2

含意演算子を探していたときにあちこちで見つけたものに基づく追加の詳細: 巧妙なハックを使用して、独自の演算子を定義できます。これは、この結果につながるソースで注釈が付けられた実行中の例です。

#!/usr/bin/python

# From http://code.activestate.com/recipes/384122/ (via http://stackoverflow.com/questions/932328/python-defining-my-own-operators)
class Infix:
    def __init__(self, function):
        self.function = function
    def __ror__(self, other):
        return Infix(lambda x, self=self, other=other: self.function(other, x))
    def __rlshift__(self, other):
        return Infix(lambda x, self=self, other=other: self.function(other, x))
    def __or__(self, other):
        return self.function(other)
    def __rshift__(self, other):
        return self.function(other)
    def __call__(self, value1, value2):
        return self.function(value1, value2)

from itertools import product

booleans = [False,True]

# http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python
# http://jacob.jkrall.net/lost-operator/
operators=[
    (Infix(lambda p,q: False),                  "F"),
    (Infix(lambda p,q: True),                   "T"),
    (Infix(lambda p,q: p and q),                "&"),
    (Infix(lambda p,q: p or q)           ,      "V"),
    (Infix(lambda p,q: p != q)           ,      "^"),
    (Infix(lambda p,q: ((not p) or not q)),     "nad"),
    (Infix(lambda p,q: ((not p) and not q)),    "nor"),
    (Infix(lambda p,q: ((not p) or q)),         "=>"),
    ]

for op,sym in operators:
    print "\nTruth tables for %s" % sym

    print "\np\tq\tp %s q\tq %s p" % (sym,sym)
    for p,q in product(booleans,repeat=2):
        print "%d\t%d\t%d\t%d" % (p,q,p |op| q,q |op| p)

    print "\np\tq\tr\tp %s q\tq %s r\t(p %s q) %s r\tp %s (q %s r)\tp %s q %s r" % (sym,sym,sym,sym,sym,sym,sym,sym)
    for p,q,r in product(booleans,repeat=3):
        print "%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t\t%d" % (p,q,r,p |op| q,q |op| r, (p |op| q) |op| r, p |op| (q |op| r), p |op| q |op| r)
        assert( (p |op| q) |op| r == p |op| q |op| r)
于 2014-03-28T16:32:18.757 に答える
1

より読みやすいワンライナーは次のようになると私は主張します

x_implies_y = y if x else True

元の例では:

if (y if x else True): do_sth()
于 2017-05-02T04:21:41.857 に答える
0

XORが良い解決策であることがわかりました。A が B を意味するように変更して、A または B ではなく、xor を使用して A を次のように否定することができます。

A^1 or B

A xor(^) 1 は not A に等しいので

于 2020-11-13T08:31:19.153 に答える