تحقق إذا تم تعيين متغير واحد فقط في قائمة المتغيرات

StackOverflow https://stackoverflow.com/questions/1032411

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أبحث عن طريقة بسيطة لمعرفة ما اذا كان متغير واحد فقط في قائمة المتغيرات لديه القيمة الحقيقية. لقد ألقيت نظرة على هذه منطقي إضافة و تحاول ايجاد وسيلة للتكيف مع متغيرات متعددة واحد فقط صحيح.

مثال

>>>TrueXor(1,0,0)
True

>>>TrueXor(0,0,1)
True

>>>TrueXor(1,1,0)
False

>>>TrueXor(0,0,0,0,0)
False
هل كانت مفيدة؟

المحلول

وليس هناك واحدة بنيت في ولكنها ليست من الصعب على لفة التي تمتلكها:

def TrueXor(*args):
    return sum(args) == 1

ومنذ "[ب] ooleans هي نوع فرعي من الأعداد الصحيحة عادي" (<لأ href = "http://docs.python.org/library/stdtypes.html#numeric-types-int-float-long-complex" يختلط = "noreferrer"> مصدر ) يمكنك جمع قائمة من الأعداد الصحيحة بسهولة تامة ويمكنك أيضا تمرير القيم المنطقية الحقيقية في هذه الوظيفة أيضا.

وحتى هذه الدعوات هما متجانسة:

TrueXor(1, 0, 0)
TrueXor(True, False, False)

إذا كنت تريد صريحة منطقية التحويل:. sum( bool(x) for x in args ) == 1

نصائح أخرى

وأعتقد أن الحل القائم على أساس المبلغ على ما يرام للمثال معين، ولكن نأخذ في الاعتبار أن قيمة المنطقية المسندات في بيثون دائما قصيرة الدوائر تقييمها. لذلك قد ترغب في النظر في شيء أكثر اتساقا مع كل وأي .

def any_one(iterable):
    it = iter(iterable)
    return any(it) and not any(it)
>>> def f(*n):
...     n = [bool(i) for i in n]
...     return n.count(True) == 1
...
>>> f(0, 0, 0)
False
>>> f(1, 0, 0)
True
>>> f(1, 0, 1)
False
>>> f(1, 1, 1)
False
>>> f(0, 1, 0)
True
>>>

والسؤال الذي يرتبط يوفر بالفعل حل لاثنين من المتغيرات. كل ما عليك القيام به هو توسيع نطاقه ليشمل العمل على المتغيرات ن:

import operator

def only_one_set(*vars):
    bools = [bool(v) for v in vars]
    return reduce(operator.xor, bools, False)

>>> a, b, c, d, e = False, '', [], 10, -99
>>> only_one_set(a, b, c, d)
True
>>> only_one_set(a, b, c, d, e)
False

إليك توجهي مباشرة. لقد تسميته لا تسمح إلا بواحد منذ XOR مع إدخال أكثر من واحد وعادة ما يكون المدقق التكافؤ، وليس المدقق "واحد فقط".

def only_one(*args):
    result = False
    for a in args:
        if a:
            if result:
                return False
            else:
                result = True
    return result

والاختبار:

>>> only_one(1,0,0)
True
>>> only_one(0,0,1)
True
>>> only_one(1,1,0)
False
>>> only_one(0,0,0,0,0)
False
>>> only_one(1,1,0,1)
False
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top