programing

단일 값에 대해 여러 변수가 동일한지 검정하려면 어떻게 해야 합니까?

projobs 2022. 9. 18. 14:21
반응형

단일 값에 대해 여러 변수가 동일한지 검정하려면 어떻게 해야 합니까?

여러 변수를 정수로 비교하고 세 글자의 문자열을 출력하는 함수를 만들려고 합니다.이것을 파이썬으로 번역할 수 있는 방법이 없을까 생각하고 있습니다.예를 들어 다음과 같습니다.

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"]

부울식의 구조를 잘못 알고 있습니다.부울식은 영어 문장과 같이 동작하지 않기 때문에, 여기서 말하는 것은 모든 이름에 대해 같은 비교를 하고 있는 것 같습니다.찾으시는 제품:

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

x ★★★★★★★★★★★★★★★★★」y된다.False0,True렇지않않않않않않경)

값은 태플에 대한 격납 테스트를 사용하여 줄일 수 있습니다.

if 1 in (x, y, z):

또는 더 나은 방법:

if 1 in {x, y, z}:

a를 사용하여 고정 비용 멤버십 테스트를 활용합니다(즉,in왼쪽 피연산자가 무엇이든 일정한 시간이 소요됩니다).

설명.

「 」를 사용하는 or, python은 연산자의 각 측면을 별도의 표현으로 봅니다.표현x or y == 1는 첫 번째 됩니다.xFalse이면 False라는 y == 1테스트되고 있습니다.

는 연산자의 우선순위에 기인합니다.or는 '우선순위'보다.==테스트하기 때문에 후자를 먼저 평가됩니다.

하지만, 이것이 사실이 아니더라도, 그리고 그 표현은x or y or z == 1 (x or y or z) == 1대신, 이것은 여전히 당신이 기대한 대로 되지 않을 것입니다.

x or y or z는 첫 를 들어, '', '진지하게', '진지하게', '진지하게 '진지하게', '진지하게', '진지하게', '진지하게 됩니다.False, 숫자 0 또는 비어 있습니다(부울 컨텍스트에서 Python이 false라고 간주하는 것에 대한 자세한 내용은 부울식을 참조하십시오).

이 은 "" " " " " " " " " " " " " " "x = 2; y = 1; z = 0,x or y or z2진실하다 ★★★★★★★★★★★★★★★.2 == 1False, 그래도.y == 1True.

대해 여러 하는 역도 입니다. 즉, 하나의 변수에 여러 값을 테스트합니다.x == 1 or 2 or 3같은 이유로 실패할 수도 있습니다.x == 1 or x == 2 or x == 3 ★★★★★★★★★★★★★★★★★」x in {1, 2, 3}.

다음과 같은 사전 구조를 사용하면 문제를 쉽게 해결할 수 있습니다.

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

Martijn Pieters가 말한 바와 같이 정확하고 빠른 형식은 다음과 같습니다.

if 1 in {x, y, z}:

Python이 if-statement가 "If-statement"인지 각 수 가 "If-statement", "Python"이 "If-statement"인지 아닌지는 Python"가 알 수 .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-loop을 사용하면 됩니다.

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

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)

BTW 은많많많많 bif 쓸 수 요.

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

매우 게으른 경우 값을 배열 안에 넣을 수 있습니다.예를 들어

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 스테이트먼트보다 훨씬 복잡할 것입니다.그게 바로 당신이 더 게으르려고 노력한 것의 결과입니다:)

한 가지 더, 당신의

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

이 변수 내에 되어 있는지 합니다.itertools ★★★★★★★★★★★★★★★★★」operator.

예를 들어 다음과 같습니다.

Import:

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

기타...

은 이은 this, 다보 the the the the보다 합니다.lambda x: x in (variables)operator로, 「사용 속도」를 사용하는 입니다.lambda커스텀 임플레이스 함수를 작성해야 합니다.

목록에 0이 아닌(또는 False) 값이 있는지 확인하는 다른 옵션:

not (x and y and z)

동등:

not all((x, y, z))

여기서 세트가 좋은 접근법입니다.이치노을 사용법 {z,y,x}{0,1,3}파라미터의 순서와 상관없습니다.

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

이렇게 하면 전체 용액이 O(n)가 됩니다.

이렇게 하면 더 잘 대처할 수 있을 것 같아요.

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

if를 사용하는 경우 다음 명령문을 사용할 수도 있습니다.

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)

된 모든 사항에 을 맞추고 , 에 and and and and and and and and and and and and and and and all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all and and and and and and and and and and에 초점을 맞추고 있습니다.if 1 in {x,y,z}마르틴 피에테르스
그들이 무시한 것은 이 질문의 광범위한 함축이다.
하나의 변수를 여러 값에 대해 테스트하려면 어떻게 해야 합니까?
다음과 같은 문자열을 사용하는 경우 제공된 솔루션은 부분 적중에는 작동하지 않습니다.
가 여러 합니다.

>>> 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

세 글자rot목록에는 조합으로 존재하지만 개별 단어로 존재하지 않습니다. in hell대한 중 hell"이라면rot in hell"도 합니다.
결론적으로 이 방법을 사용할 경우 검색 기준에 주의해야 하며 이 제한 사항이 있음을 유의해야 합니다.

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]

이 코드가 도움이 될 수 있습니다.

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;

다음에 나타내는 방법을 시험해 볼 수 있습니다.이 방법에서는 입력할 변수 수를 자유롭게 지정/입력할 수 있습니다.

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

단일 라인 솔루션:

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

출력 비트 세트에 대한 직접 공식이 필요할 수 있습니다.

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입니다.

그러면 총 방정식 express sum과 총 공식의 합이 나옵니다.

sum&1은 c, sum&2는 d, sum&4는 e, sum&5는 f이다.

그 후 문자열 요소의 인덱스가 준비 문자열에 대응하는 사전 정의된 배열을 형성할 수 있습니다.

array[sum]을 사용하다

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")

로서 쉽게 할 수 있다.

for value in [var1,var2,var3]:
     li.append("targetValue")

하려면 다음 절차를 합니다.if 1 in {a,b,c}:

하여 여러 절차를 수행합니다.if a in {1, 2, 3}:

시저 암호 같은 걸 만들고 있는 것 같은데

보다 일반적인 접근방식은 다음과 같습니다.

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

사전을 사용할 수 있습니다.

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

dict를 사용하지 않고 다음 해결 방법을 시도해 보십시오.

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

다음과 같은 기능을 제공합니다.

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

이게 도움이 될 거야

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);

당신은 이것을 통합할 수 있다.

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

당신은 두 가지 방법을 통해 그것을 발전시킬 수 있다.

    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)

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

문제

여러 값을 테스트하기 위한 패턴은

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

가독성이 매우 높고, 많은 상황에서 동작하고 있는 경우, 다음과 같은 문제가 있습니다.

>>> 0 in {True, False}
True

하지만 저희는

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

솔루션

이전 표현의 일반화는 ytpillai의 답변에 기초하고 있습니다.

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

라고 쓸 수 있다

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

이 식은 올바른 결과를 반환하지만 첫 번째 식만큼 읽을 수 없습니다:-(

그 밖에 한 가지 방법이 있습니다.

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")

리스트 이해와 임의의 키워드를 조합한 것입니다.

예를 들어 사용하지 않는 경우:

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)

번째, A THE first first 、 정 first first first first first 。OR 예:

다음과 같이 말할 필요가 있습니다.

if x == 0 or y == 0 or z == 0:

그 이유는 "또는" 상태가 별개의 논리적인 부분으로 분할되기 때문입니다.원래 진술이 작성된 방식은 다음과 같습니다.

x
y
z == 0   // or 1, 2, 3 depending on the if statement

은 예를 z 0, 두 은 기본적으로 'z == 0 인데' 요.if x ★★★★★★★★★★★★★★★★★」if y 수로 평가되기 때문에TrueTruex ★★★★★★★★★★★★★★★★★」y는 0이 되므로 ).y = 1 정도 에) .ORworks는 항상 ★★★★★★★★★★★★★★★★★★★」True.

)를 .OR가 있어요. (척 .)OR됩니다.OR조건이 올바르게 정의되어 있습니다.

다음과 같이 개별적으로 문장을 작성합니다.

if x == 0
if y == 0
if z == 0

은 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.OR츠키다

if x == 0 or y == 0 or z == 0

둘째, 문제 해결 방법:

기본적으로 주어진 정수와 일치하는 변수가 있는지 확인하고, 일치하는 변수가 있는 경우 1 대 1 매핑에서 일치하는 문자를 할당해야 합니다.특정 정수 목록에 대해 이 작업을 수행하여 출력이 문자 목록이 되도록 할 수 있습니다.이렇게 하면 됩니다.

def func(x, y, z):

    result = []

    for integer, letter in zip([0, 1, 2, 3], ['c', 'd', 'e', 'f']):
        if x == integer or y == integer or z == integer:
            result.append(letter)
            
    return result
        

마찬가지로 LIST CONFRIGENCHION을 사용하여 동일한 결과를 보다 빠르게 얻을 수 있습니다.

def func(x, y, z):

    return [ 
                letter 
                for integer, letter in zip([0, 1, 2, 3], ['c', 'd', 'e', 'f'])
                if x == integer or y == integer or z == integer
           ]
    
    
#selection
: a=np.array([0,1,3])                                                                                                                                                 

#options
: np.diag(['c','d','e','f']) 
array([['c', '', '', ''],
       ['', 'd', '', ''],
       ['', '', 'e', ''],
       ['', '', '', 'f']], dtype='<U1')

이제 를 [row,col]실렉터로 사용할 수 있습니다.이것은, 임의의(...) 조건과 같이 동작합니다.

#list of options[sel,sel]
: np.diag(['c','d','e','f'])[a,a]                                                                                                                                     

 array(['c', 'd', 'f'], dtype='<U1')

언급URL : https://stackoverflow.com/questions/15112125/how-to-test-multiple-variables-for-equality-against-a-single-value

반응형