3

タプルを指定すると、このタプルのすべての要素が同じ符号であるかどうかを比較する小さな関数を作成しました。

たとえば、tuple =[-1, -4, -6, -8]は良いです[-1, -4, 12, -8]が、悪いです。私が最もスマートな実装を作成したかどうかはわかりません。そのため、ここで質問することをお勧めします。

def check_consistent_categories(queryset):
    try:
        first_item = queryset[0].amount

        if first_item < 0:
            for item in queryset:
                if item > 0:
                    return False
            return True
        else:
            for item in queryset:
                if item < 0:
                    return False
            return True
    except:
        return False
4

9 に答える 9

14

これはあなたを助けるかもしれません:

def all_same_sign(ints):
    return all(x < 0 for x in ints) or all(x > 0 for x in ints)

0 をどのように扱いたいかによって、< と > を <= と >= に変更することができます。

于 2010-12-29T22:16:49.807 に答える
3

@EOL のソリューションの後ですが、リストのインデックス作成や複数回の反復なしで機能します。

def all_same_sign(sequence):
    items = iter(sequence)
    try:
        first = items.next() > 0
    except StopIteration:
        return True
    return all((item > 0) == first for item in items)

これも私に起こりましたが、すべて/任意の短絡を利用していません:

def all_same_sign(sequence):
    return len(set(item > 0 for item in sequence)) <= 1
于 2010-12-29T23:25:56.280 に答える
1

すべての数値が同じ符号である場合、個々の数値の絶対値の合計は、各数値の合計の絶対値に等しくなるという事実を利用してみませんか?

def check_sign(queryset):
    return abs(sum(queryset)) == sum(map(abs, queryset))

数学の詳細を示す例

ケース 1:すべての数字の符号が同じ

a = (-1, -4, -8)
sum(a) = -13
abs(sum(a)) = 13        # the absolute value of the tuple's sum
map(abs, a) = [1, 4, 8]
sum(map(abs, a)) = 13   # the tuple's sum of each element's absolute value

どちらの方法でも 13 が得られるため、符号は同じです。

ケース 2:すべての数字が同じ符号を持っているわけではありません

b = (-1, 4, 8)
sum(b) = 11
abs(sum(b)) = 11        # the absolute value of the tuple's sum 
map(abs, b) = [1, 4, 8]
sum(map(abs, b)) = 13   # the tuple's sum of each element's absolute value

メソッドは異なる数値 (11 と 13) を生成するため、符号はすべて同じではありません。

于 2010-12-29T22:53:06.883 に答える
1
def all_same_sign(iterable):
    # Works with any iterable producing any items that can be compared to zero.
    # Iterates through the input no more than once, and this fact is immediately
    # obvious from the code.
    # Exits as soon as a bad combination has been detected.
    pos = neg = zero = False
    for item in iterable:
        if item > 0:
            pos = True
        elif item < 0:
            neg = True
        else:
            zero = True
        # Adjust the following statement if a different
        # treatment of zero is required.
        # Redundant parentheses added for clarity.
        if (pos and neg) or zero:
            return False
    return True
于 2011-01-01T02:36:52.477 に答える
1

これを行っているため、無関係なニットが1つだけです:

try:
    [...]
except:
    [...]

あなたは例外を無視しallています。非常に注意してください、私の友人、これは多くのバグを隠します。代わりに、例外処理を行うときは常に正確にしてください。

try:
    [...]
except IndexError:
    # Handle out of index
except IOError:
    # Handle I/O error

など。より大きな Python アプリケーションをコーディングするときは、このことを念頭に置いてください。

于 2010-12-29T22:26:04.903 に答える
1

これを行うための素敵なpythonicの方法を次に示します(を使用all()):

from math import copysign

sign = lambda x: copysign(1, x)  # Sign function

def check_consistent_categories(sequence):
    main_sign = sign(sequence[0])
    return all(sign(y) == main_sign for y in sequence)

(関数を導入したPython 2.6+のmath.copysign()場合)。このソリューションでは、0 が正であると見なされます。

ただし、Mark Byers のソリューションはより柔軟であり、間違いなくより読みやすくなっています。

于 2010-12-29T22:19:27.170 に答える
1

これは、ジェネレーターなどでもうまく機能するものです。

def all_same_sign(ints):
    ints = iter(ints)
    first_is_positive = next(ints) > 0
    return all( (x>0) == first_is_positive for x in ints)

が空の場合ints、StopIteration 例外が発生します。

このバージョンは 0 を負の数で囲みます。>=代わりに正の数でグループ化したい場合に使用します

于 2010-12-30T06:53:09.327 に答える
0

番号が並べ替えられている場合は、端を比較するだけで済みます。そうでない場合は、それらを並べ替えることができます。

def same_sign(numbers):
    numbers = sorted(numbers)
    #if numbers[0]==0: return True                Uncomment if you consider 0 positive
    if numbers[0]*numbers[-1]>0: return True
    return False

これを>=0ゼロに変更した場合、符号ニュートラルと見なされます。これが現在の回答よりも優れた実装であるかどうかはわかりませんが、大量のデータセットの場合は高速になる可能性があります。

于 2010-12-29T22:51:15.643 に答える
0

数値を乗算すると、それらがすべて同じである場合は正の結果が得られ、そうでない場合は負の結果が得られるという原則を使用します。

import operator

def all_same_sign(intlist):
    return reduce(operator.mul, intlist) > 0

>>> all_same_sign([-1, -4, -6, -8])
True
>>> all_same_sign([-1, -4, 12, -8])
False

ただし、これはゼロを処理しません...

于 2010-12-31T17:05:38.993 に答える