777

複数の変数を整数と比較し、3文字の文字列を出力する関数を作成しようとしています。これをPythonに変換する方法があるかどうか疑問に思いました。だから、言って:

x = 0
y = 1
z = 3
mylist = []

if x or y or z == 0 :
    mylist.append("c")
if x or y or z == 1 :
    mylist.append("d")
if x or y or z == 2 :
    mylist.append("e")
if x or y or z == 3 : 
    mylist.append("f")

次のリストが返されます。

["c", "d", "f"]

このようなことは可能ですか?

4

28 に答える 28

1039

ブール式がどのように機能するかを誤解しています。それらは英語の文のようには機能せず、ここですべての名前について同じ比較について話していると推測します。あなたは探している:

if x == 1 or y == 1 or z == 1:

xそれy以外の場合は、独自に評価されます(Falseそう0Trueない場合)。

タプルに対する包含テストを使用して、これを短縮できます。

if 1 in (x, y, z):

またはそれ以上:

if 1 in {x, y, z}:

を使用setて一定コストのメンバーシップテストを利用します(つまりin、左側のオペランドが何であれ、一定の時間がかかります)。

説明

を使用するorと、Pythonは演算子の各側を個別の式として認識します。式x or y == 1は最初にのブールテストとして扱われx、それがFalseの場合、式y == 1がテストされます。

これは、演算子の優先順位によるものです。演算子のor優先順位はテストよりも低い==ため、テストが最初に評価されます。

ただし、これが当てはまらず、式x or y or z == 1が実際には代わりに解釈されたとして(x or y or z) == 1も、これは期待どおりの動作をしません。

x or y or z'truthy'である最初の引数に評価されます。たとえばFalse、数値0または空ではありません(ブール式のコンテキストでPythonがfalseと見なすものの詳細については、ブール式を参照してください)。

したがって、値の場合x = 2; y = 1; z = 0x or y or zはに解決され2ます。これは、引数の最初の真のような値であるためです。2 == 1Falseはいえ、そうy == 1なるでしょうTrue

同じことが逆にも当てはまります。単一の変数に対して複数の値をテストします。x == 1 or 2 or 3同じ理由で失敗します。x == 1 or x == 2 or x == 3またはを使用しx in {1, 2, 3}ます。

于 2013-02-27T12:27:40.217 に答える
113

あなたの問題は、次のような辞書構造でより簡単に対処できます。

x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
于 2013-07-11T21:56:54.860 に答える
75

Martijn Pietersが述べているように、正確で最速の形式は次のとおりです。

if 1 in {x, y, z}:

彼のアドバイスを使用すると、Pythonが各ステートメントを前者がそうであるかどうかに関係なく読み取ることができるように、個別のifステートメントが作成されTrueますFalse。そのような:

if 0 in {x, y, z}:
    mylist.append("c")
if 1 in {x, y, z}:
    mylist.append("d")
if 2 in {x, y, z}:
    mylist.append("e")
...

これは機能しますが、辞書の使用に慣れている場合(私がそこで行ったことを参照)、数値を目的の文字にマッピングする最初の辞書を作成し、forループを使用するだけでこれをクリーンアップできます。

num_to_letters = {0: "c", 1: "d", 2: "e", 3: "f"}
for number in num_to_letters:
    if number in {x, y, z}:
        mylist.append(num_to_letters[number])
于 2015-08-19T02:34:58.547 に答える
52

直接書く方法x or y or z == 0

if any(map((lambda value: value == 0), (x,y,z))):
    pass # write your logic.

しかし、私は思いません、あなたはそれが好きです。:)そしてこの方法は醜いです。

他の方法(より良い)は次のとおりです。

0 in (x, y, z)

ところで、たくさんのifsはこのようなものとして書くことができます

my_cases = {
    0: Mylist.append("c"),
    1: Mylist.append("d")
    # ..
}

for key in my_cases:
    if key in (x,y,z):
        my_cases[key]()
        break
于 2013-07-11T21:16:33.583 に答える
35

非常に怠惰な場合は、値を配列内に配置できます。そのような

list = []
list.append(x)
list.append(y)
list.append(z)
nums = [add numbers here]
letters = [add corresponding letters here]
for index in range(len(nums)):
    for obj in list:
        if obj == num[index]:
            MyList.append(letters[index])
            break

数字や文字を辞書に入れてそれを行うこともできますが、これはおそらく単純なifステートメントよりもはるかに複雑です。それはあなたが余分な怠惰になろうとすることで得られるものです:)

もう1つ、あなたの

if x or y or z == 0:

コンパイルされますが、希望する方法ではありません。ifステートメントに変数を入れるだけの場合(例)

if b

プログラムは、変数がnullでないかどうかをチェックします。上記のステートメントを書く別の方法(より理にかなっています)は

if bool(b)

Boolは、基本的にブールステートメントを検証するコマンドを実行するPythonの組み込み関数です(それが何であるかわからない場合は、現在ifステートメントで作成しようとしているものです:))

私が見つけたもう一つの怠惰な方法は:

if any([x==0, y==0, z==0])
于 2015-05-25T03:53:36.050 に答える
33

値が変数のセットに含まれているかどうかを確認するには、組み込みモジュール itertoolsとを使用できますoperator

例えば:

輸入:

from itertools import repeat
from operator import contains

変数を宣言します:

x = 0
y = 1
z = 3

値のマッピングを(確認したい順序で)作成します。

check_values = (0, 1, 3)

itertools変数の繰り返しを許可するために使用します。

check_vars = repeat((x, y, z))

最後に、map関数を使用してイテレータを作成します。

checker = map(contains, check_vars, check_values)

次に、(元の順序で)値を確認するときに、次を使用しますnext()

if next(checker)  # Checks for 0
    # Do something
    pass
elif next(checker)  # Checks for 1
    # Do something
    pass

等...

これは、組み込みモジュールであり、カスタムインプレース関数を作成する必要があるモジュールを使用するよりも高速で効率的であるlambda x: x in (variables)ため、これよりも利点があります。operatorlambda

リストにゼロ以外(またはFalse)の値があるかどうかを確認するための別のオプション:

not (x and y and z)

同等:

not all((x, y, z))
于 2014-06-04T17:09:22.123 に答える
31

Setはここでの良いアプローチです。これは、変数を順序付けるため、ここでの目標のようです。パラメータの順序{z,y,x}は何でもです。{0,1,3}

>>> ["cdef"[i] for i in {z,x,y}]
['c', 'd', 'f']

このように、ソリューション全体はO(n)です。

于 2015-06-09T20:46:34.917 に答える
30

私はこれがそれをよりよく処理すると思います:

my_dict = {0: "c", 1: "d", 2: "e", 3: "f"}

def validate(x, y, z):
    for ele in [x, y, z]:
        if ele in my_dict.keys():
            return my_dict[ele]

出力:

print validate(0, 8, 9)
c
print validate(9, 8, 9)
None
print validate(9, 8, 2)
e
于 2015-01-13T12:10:25.557 に答える
30

ifを使用する場合は、次のelseステートメントが別の解決策です。

myList = []
aList = [0, 1, 3]

for l in aList:
    if l==0: myList.append('c')
    elif l==1: myList.append('d')
    elif l==2: myList.append('e')
    elif l==3: myList.append('f')

print(myList)
于 2015-04-10T03:29:39.387 に答える
30

ここで提供される優れた回答はすべて、元のポスターの特定の要件に集中し、if 1 in {x,y,z}MartijnPietersによって提案されたソリューションに集中しています。
彼らが無視しているのは、質問のより広い意味です
。1つの変数を複数の値に対してテストするにはどうすればよいですか?
たとえば、文字列を使用する場合、提供されるソリューションは部分ヒットでは機能しません。
文字列「Wild」が複数の値であるかどうかをテストします。

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in {x, y, z}: print (True)
... 

また

>>> x = "Wild things"
>>> y = "throttle it back"
>>> z = "in the beginning"
>>> if "Wild" in [x, y, z]: print (True)
... 

このシナリオでは、文字列に変換するのが最も簡単です

>>> [x, y, z]
['Wild things', 'throttle it back', 'in the beginning']
>>> {x, y, z}
{'in the beginning', 'throttle it back', 'Wild things'}
>>> 

>>> if "Wild" in str([x, y, z]): print (True)
... 
True
>>> if "Wild" in str({x, y, z}): print (True)
... 
True

ただし、で述べたように、次のよう@codeforesterに、この方法では単語の境界が失われることに注意し てください。

>>> x=['Wild things', 'throttle it back', 'in the beginning']
>>> if "rot" in str(x): print(True)
... 
True

3文字rotはリストに組み合わせて存在しますが、個々の単語としては存在しません。「rot」のテストは失敗しますが、リスト項目の1つが「rotin hell」の場合、それも失敗します。
結果として、この方法を使用する場合は検索条件に注意し、この制限があることに注意してください。

于 2016-09-10T15:44:32.407 に答える
26
d = {0:'c', 1:'d', 2:'e', 3: 'f'}
x, y, z = (0, 1, 3)
print [v for (k,v) in d.items() if x==k or y==k or z==k]
于 2015-02-27T01:31:00.527 に答える
26

このコードは役立つかもしれません

L ={x, y, z}
T= ((0,"c"),(1,"d"),(2,"e"),(3,"f"),)
List2=[]
for t in T :
if t[0] in L :
    List2.append(t[1])
    break;
于 2015-06-29T07:03:58.413 に答える
13

以下の方法を試すことができます。この方法では、入力する変数の数を自由に指定/入力できます。

mydict = {0:"c", 1:"d", 2:"e", 3:"f"}
mylist= []

num_var = int(raw_input("How many variables? ")) #Enter 3 when asked for input.

for i in range(num_var): 
    ''' Enter 0 as first input, 1 as second input and 3 as third input.'''
    globals()['var'+str('i').zfill(3)] = int(raw_input("Enter an integer between 0 and 3 "))
    mylist += mydict[globals()['var'+str('i').zfill(3)]]

print mylist
>>> ['c', 'd', 'f']
于 2018-12-03T05:13:18.373 に答える
10

ワンラインソリューション:

mylist = [{0: 'c', 1: 'd', 2: 'e', 3: 'f'}[i] for i in [0, 1, 2, 3] if i in (x, y, z)]

または:

mylist = ['cdef'[i] for i in range(4) if i in (x, y, z)]
于 2017-06-05T06:50:28.773 に答える
9

Pythonで擬似コードを表現する最もPython的な方法は、次のとおりです。

x = 0
y = 1
z = 3
mylist = []

if any(v == 0 for v in (x, y, z)):
    mylist.append("c")
if any(v == 1 for v in (x, y, z)):
    mylist.append("d")
if any(v == 2 for v in (x, y, z)):
    mylist.append("e")
if any(v == 3 for v in (x, y, z)):
    mylist.append("f")
于 2018-08-06T06:26:34.530 に答える
9

たぶん、出力ビットセットの直接式が必要です。

x=0 or y=0 or z=0   is equivalent to x*y*z = 0

x=1 or y=1 or z=1   is equivalent to (x-1)*(y-1)*(z-1)=0

x=2 or y=2 or z=2   is equivalent to (x-2)*(y-2)*(z-2)=0

ビットにマッピングしましょう:'c':1 'd':0xb10 'e':0xb100 'f':0xb1000

iscの関係(is'c'):

if xyz=0 then isc=1 else isc=0

数式がhttps://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315の場合は数学を使用します

[c]:(xyz=0 and isc=1) or (((xyz=0 and isc=1) or (isc=0)) and (isc=0))

[d]:((x-1)(y-1)(z-1)=0 and isc=2) or (((xyz=0 and isd=2) or (isc=0)) and (isc=0))

..。

次のロジックでこれらの数式を接続します。

  • 論理andは方程式の二乗の合計です
  • 論理orは方程式の産物です

合計を表す合計方程式があり、合計の合計式があります

次に、sum&1はc、sum&2はd、sum&4はe、sum&5はfです。

この後、文字列要素のインデックスが準備完了文字列に対応する事前定義された配列を形成できます。

array[sum]あなたに文字列を与えます。

于 2019-02-17T17:55:26.153 に答える
7

それは次のように簡単に行うことができます

for value in [var1,var2,var3]:
     li.append("targetValue")
于 2018-11-06T14:26:24.817 に答える
5

1つの値で複数の変数をテストするには:if 1 in {a,b,c}:

1つの変数で複数の値をテストするには:if a in {1, 2, 3}:

于 2018-09-20T02:18:55.697 に答える
4

ある種のシーザー暗号を構築しているようです。

より一般化されたアプローチはこれです:

input_values = (0, 1, 3)
origo = ord('c')
[chr(val + origo) for val in inputs]

出力

['c', 'd', 'f']

それがコードの望ましい副作用であるかどうかはわかりませんが、出力の順序は常に並べ替えられます。

これが必要な場合は、最終行を次のように変更できます。

sorted([chr(val + origo) for val in inputs])
于 2018-08-27T09:45:00.790 に答える
3

あなたは辞書を使うことができます:

x = 0
y = 1
z = 3
list=[]
dict = {0: 'c', 1: 'd', 2: 'e', 3: 'f'}
if x in dict:
    list.append(dict[x])
else:
    pass

if y in dict:
    list.append(dict[y])
else:
    pass
if z in dict:
    list.append(dict[z])
else:
    pass

print list
于 2018-07-31T16:54:00.637 に答える
3

口述なしで、この解決策を試してください:

x, y, z = 0, 1, 3    
offset = ord('c')
[chr(i + offset) for i in (x,y,z)]

そして与える:

['c', 'd', 'f']
于 2019-10-11T12:17:15.273 に答える
2

あなたはこれを団結させることができます

x = 0
y = 1
z = 3

1つの変数で。

In [1]: xyz = (0,1,3,) 
In [2]: mylist = []

次のように条件を変更します。

In [3]: if 0 in xyz: 
    ...:     mylist.append("c") 
    ...: if 1 in xyz: 
    ...:     mylist.append("d") 
    ...: if 2 in xyz: 
    ...:     mylist.append("e") 
    ...: if 3 in xyz:  
    ...:     mylist.append("f") 

出力:

In [21]: mylist                                                                                
Out[21]: ['c', 'd', 'f']
于 2019-09-09T18:23:24.270 に答える
2

この回答で説明されてorいるように、はそのようには機能しません。

一般的な答えは使用されますが

if 0 in (x, y, z):
    ...

これは特定の問題に最適なものではありません。あなたの場合、繰り返しテストを行っているので、これらの変数のセットを作成することは価値があります。

values = {x, y, z}

if 0 in values:
    mylist.append("c")

if 1 in values:
    mylist.append("d")

辞書を使用してこれを単純化できます-これは同じ値になります:

mappings = {0: "c", 1: "d", ...}
for k in mappings:
    if k in values:
        mylist.append(mappings[k])

または、の順序mylistが任意の場合は、代わりにをループして、マッピングに一致させることができます。

mappings = {0: "c", 1: "d", ...}
for v in (x, y, z):
    if v in mappings:
        mylist.append(mappings[v])
于 2021-04-11T19:30:17.260 に答える
1

これはあなたを助けます。

def test_fun(val):
    x = 0
    y = 1
    z = 2
    myList = []
    if val in (x, y, z) and val == 0:
        myList.append("C")
    if val in (x, y, z) and val == 1:
        myList.append("D")
    if val in (x, y, z) and val == 2:
        myList.append("E")

test_fun(2);
于 2019-04-05T22:03:52.720 に答える
1

あなたは2つの方法でそれを開発することができます

    def compareVariables(x,y,z):
        mylist = []
        if x==0 or y==0 or z==0:
            mylist.append('c')
        if  x==1 or y==1 or z==1:
            mylist.append('d')
        if  x==2 or y==2 or z==2:
            mylist.append('e')
        if  x==3 or y==3 or z==3:
            mylist.append('f')
        else:
            print("wrong input value!")
        print('first:',mylist)

        compareVariables(1, 3, 2)

または

    def compareVariables(x,y,z):
        mylist = []
        if 0 in (x,y,z):
             mylist.append('c')
        if 1 in (x,y,z):
             mylist.append('d')
        if 2 in (x,y,z):
             mylist.append('e')
        if 3 in (x,y,z):
             mylist.append('f')
        else:
             print("wrong input value!")
        print('second:',mylist)

        compareVariables(1, 3, 2)
于 2020-09-09T12:01:06.013 に答える
0

問題

複数の値をテストするためのパターン

>>> 2 in {1, 2, 3}
True
>>> 5 in {1, 2, 3}
False

非常に読みやすく、多くの状況で機能しています。落とし穴が1つあります。

>>> 0 in {True, False}
True

でも欲しい

>>> (0 is True) or (0 is False)
False

解決

前の式の一般化の1つは、 ytpillaiからの回答に基づいています。

>>> any([0 is True, 0 is False])
False

これは次のように書くことができます

>>> any(0 is item for item in (True, False))
False

この式は正しい結果を返しますが、最初の式ほど読みやすくはありません:-(

于 2019-11-06T11:11:52.207 に答える
0

ifの例なしの使用法:

x,y,z = 0,1,3
values = {0:"c",1:"d",2:"e",3:"f"} # => as if usage
my_list = [values[i] for i in (x,y,z)]

print(my_list)
于 2022-01-22T19:40:34.227 に答える
-1

これを行うもう1つの方法があります。

x = 0
y = 1
z = 3
mylist = []

if any(i in [0] for i in[x,y,z]):
    mylist.append("c")
if any(i in [1] for i in[x,y,z]):
    mylist.append("d")
if any(i in [2] for i in[x,y,z]):
    mylist.append("e")
if any(i in [3] for i in[x,y,z]):
    mylist.append("f")

これは、リスト内包表記と任意のキーワードの組み合わせです。

于 2021-02-27T12:35:01.273 に答える