จะทดสอบตัวแปรหลายตัวกับค่าได้อย่างไร


644

ฉันพยายามสร้างฟังก์ชั่นที่จะเปรียบเทียบตัวแปรหลายตัวกับจำนวนเต็มและส่งออกสตริงของตัวอักษรสามตัว ฉันสงสัยว่ามีวิธีในการแปลภาษานี้เป็น 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"]

เป็นไปได้อย่างนี้ไหม?


5
ใช้1ใน (tuple)

2
เมื่อคุณต้องการที่จะประเมินรายการของงบในลักษณะใด ๆ / ทั้งหมดที่คุณสามารถใช้any/ allฟังก์ชั่น ตัวอย่างเช่น: all([1, 2, 3, 4, False])จะคืนค่าเท็จall([True, 1, 2, 3])จะคืนค่าจริงany([False, 0, 0, False])จะคืนค่าเท็จany([False, 0, True, False])จะกลับมาจริง
eddd

4
คำถามนี้เป็นเป้าหมายซ้ำซ้อนที่ได้รับความนิยมมาก แต่ฉันคิดว่ามันไม่ดีพอสำหรับวัตถุประสงค์นั้น คนส่วนใหญ่พยายามทำสิ่งที่ชอบif x == 0 or 1:ซึ่งแน่นอนว่าคล้ายกับif x or y == 0:แต่อาจสับสนเล็กน้อยสำหรับมือใหม่อย่างไรก็ตาม เมื่อพิจารณาจาก"ทำไมฉันถึงไม่x == 0 or 1ทำงานล่ะ" คำถามฉันจะใช้คำถามนี้เป็นเป้าหมายซ้ำซ้อนของเราสำหรับคำถามเหล่านี้
Aran-Fey

1
ระมัดระวังเป็นพิเศษเมื่อเทียบกับ "falsey" ค่าชอบ0, หรือ0.0 Falseคุณสามารถเขียนรหัสผิดที่ให้คำตอบ "ถูก" ได้อย่างง่ายดาย
smci

1
สำหรับสิ่งที่ตรงกันข้ามดูการเปรียบเทียบสตริงกับหลายรายการใน Python
tripleee

คำตอบ:


850

คุณเข้าใจผิดว่านิพจน์บูลีนทำงานอย่างไร พวกเขาไม่ได้ทำงานเหมือนประโยคภาษาอังกฤษและเดาว่าคุณกำลังพูดถึงการเปรียบเทียบชื่อเดียวกันทั้งหมดที่นี่ คุณกำลังมองหา:

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

xและyได้รับการประเมินเป็นอย่างอื่นด้วยตนเอง ( Falseถ้า0เป็นTrueอย่างอื่น)

คุณสามารถย่อให้สั้นลงได้โดยใช้การทดสอบการบรรจุกับtuple :

if 1 in (x, y, z):

หรือยังดีกว่า:

if 1 in {x, y, z}:

การใช้asetเพื่อใช้ประโยชน์จากการทดสอบการเป็นสมาชิกค่าใช้จ่ายคงที่ ( inใช้เวลาจำนวนคงที่ไม่ว่าจะเป็นตัวถูกดำเนินการทางซ้าย)

เมื่อคุณใช้งานorหลามจะเห็นแต่ละด้านของโอเปอเรเตอร์เป็นนิพจน์แยกกัน นิพจน์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จะประเมินค่าอาร์กิวเมนต์แรกที่เป็น 'ความจริง' เช่นไม่ใช่Falseตัวเลข 0 หรือว่างเปล่า (ดูนิพจน์บูลีนสำหรับรายละเอียดเกี่ยวกับสิ่งที่ Python พิจารณาว่าเป็นเท็จในบริบทบูลีน)

ดังนั้นสำหรับค่าx = 2; y = 1; z = 0, x or y or zจะแก้2เพราะนั่นเป็นครั้งแรกที่จริงเช่นค่าในการขัดแย้ง จากนั้น2 == 1จะFalseแม้ว่าจะเป็นy == 1True

เช่นเดียวกับสิ่งที่ตรงกันข้าม ทดสอบค่าหลายค่ากับตัวแปรเดียว x == 1 or 2 or 3จะล้มเหลวด้วยเหตุผลเดียวกัน ใช้หรือx == 1 or x == 2 or x == 3x in {1, 2, 3}


116
ฉันไม่อยากไปsetรุ่นเร็วนัก Tuple's มีราคาถูกมากในการสร้างและทำซ้ำ อย่างน้อยในเครื่องของฉันสิ่งอันดับจะเร็วกว่าชุดตราบใดที่ขนาดของ tuple อยู่ที่ประมาณ 4-8 องค์ประกอบ หากคุณต้องสแกนมากกว่านั้นให้ใช้ชุด แต่ถ้าคุณกำลังมองหาไอเท็มที่มีความเป็นไปได้ 2-4 อย่าง tuple ยังเร็วกว่า! หากคุณสามารถจัดให้สำหรับกรณีที่ส่วนใหญ่มีแนวโน้มที่จะเป็นครั้งแรกในอันดับที่ชนะที่ยิ่งใหญ่คือ (การทดสอบของฉัน: timeit.timeit('0 in {seq}'.format(seq=tuple(range(9, -1, -1)))))
SingleNegationElimination

57
@dequestarmappartialsetattr: ใน Python 3.3 และสูงกว่าชุดจะถูกจัดเก็บเป็นค่าคงที่โดยข้ามเวลาการสร้างไปพร้อม ๆ กันโดยกำจัดเวลาในการสร้าง Tuples อาจมีราคาถูกในการสร้างเมื่อ Python แคชชุดข้อมูลเหล่านั้นเพื่อหลีกเลี่ยงความผิดพลาดของหน่วยความจำทำให้สิ่งที่แตกต่างที่สุดกับชุดที่นี่
Martijn Pieters

13
@dequestarmappartialsetattr: ถ้าคุณมีเวลาแค่การทดสอบการเป็นสมาชิกสำหรับชุดจำนวนเต็มและ tuples นั้นเร็วพอ ๆ กันสำหรับสถานการณ์ในอุดมคติ จับคู่องค์ประกอบแรก หลังจากนั้นสิ่งอันดับทูเปิลก็หายไปเป็นเซ็ต
Martijn Pieters

17
@MartijnPieters: การใช้setสัญกรณ์ที่เป็นตัวอักษรสำหรับการทดสอบนี้ไม่ได้เป็นการประหยัดหากว่าเนื้อหาของsetตัวอักษรนั้นเป็นตัวอักษรด้วยใช่ไหม? if 1 in {x, y, z}:ไม่สามารถแคชsetเพราะx, yและzอาจมีการเปลี่ยนแปลงดังนั้นทั้งความต้องการแก้ปัญหาในการสร้างtupleหรือsetจากรอยขีดข่วนและฉันสงสัยว่าสิ่งที่ค้นหาการออมที่คุณอาจได้รับเมื่อตรวจสอบการเป็นสมาชิกจะถูกทับถมด้วยมากขึ้นsetเวลาที่สร้าง
ShadowRanger

9
@ShadowRanger: ใช่การเพิ่มประสิทธิภาพช่องมอง (ไม่ว่าจะเพื่อin [...]หรือin {...}) ใช้งานได้ก็ต่อเมื่อเนื้อหาของรายการหรือชุดนั้นเป็นตัวอักษรที่ไม่เปลี่ยนรูปแบบเช่นกัน
Martijn Pieters

96

ปัญหาของคุณได้รับการแก้ไขได้ง่ายขึ้นด้วยโครงสร้างพจนานุกรมเช่น:

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

21
หรือแม้แต่d = "cdef"สิ่งที่นำไปสู่MyList = ["cdef"[k] for k in [x, y, z]]
aragaer

9
หรือmap(lambda i: 'cdef'[i], [x, y, z])
dansalmo

3
@MJM คำสั่งเอาท์พุทไม่ได้ถูกกำหนดโดย dict, มันถูกกำหนดโดยคำสั่งของรายการ[x, y, z]
dansalmo

1
นอกเหนือจากความเข้าใจในรายการซึ่งฉันยังไม่คุ้นเคยอย่างเต็มที่พวกเราส่วนใหญ่ก็มีความคิดแบบเดียวกันนั่นคือสร้างคำพูดนั้น!
LoneWanderer

66

ตามที่ระบุโดย Martijn Pieters รูปแบบที่ถูกต้องและเร็วที่สุดคือ:

if 1 in {x, y, z}:

ใช้คำแนะนำของเขาที่คุณจะตอนนี้มีแยกต่างหากถ้างบเพื่อให้งูหลามจะอ่านคำสั่งแต่ละไม่ว่าจะเป็นอดีตหรือ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])

45

วิธีการเขียนโดยตรง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 ifสามารถเขียนได้มากมายเช่นนี้

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

8
ในตัวอย่างของคุณdictแทนการสำคัญคุณจะได้รับข้อผิดพลาดเนื่องจากค่าตอบแทนของ.appendเป็นNoneและโทรให้None AttributeErrorโดยทั่วไปฉันเห็นด้วยกับวิธีนี้แม้ว่า
SethMMorton

2
dict แทนคีย์ผิดคุณจะได้ Mylist = ['c', 'd'] เมื่อพจนานุกรมเริ่มต้นแม้ว่าคุณจะคอมเม้นท์ "for..loop" ส่วน
Mahmoud Elshahat

1
ในตัวอย่างแรกของคุณfilterน่าจะดีกว่าmapเพราะมันจะคืนค่าเฉพาะกรณีที่แลมบ์ดาประเมินว่าเป็นจริง
Alex

1
ความเข้าใจนั้นง่ายกว่าแผนที่แลมบ์ดามาก:any(v == 0 for v in (x, y, z))
wjandrea

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 x or y or z == 0:

จะรวบรวม แต่ไม่ใช่ในแบบที่คุณต้องการ เมื่อคุณใส่ตัวแปรในคำสั่ง if (ตัวอย่าง)

if b

โปรแกรมจะตรวจสอบว่าตัวแปรไม่เป็นโมฆะหรือไม่ อีกวิธีในการเขียนข้อความข้างต้น (ซึ่งเหมาะสมกว่า) คือ

if bool(b)

Bool เป็นฟังก์ชั่น inbuilt ในไพ ธ อนซึ่งโดยทั่วไปแล้วคำสั่งของการตรวจสอบคำสั่งบูลีน (ถ้าคุณไม่รู้ว่ามันคืออะไรมันคือสิ่งที่คุณพยายามทำในคำสั่ง if ตอนนี้ :))

อีกวิธีที่ขี้เกียจที่ฉันพบคือ:

if any([x==0, y==0, z==0])

3
-1 มีการปฏิบัติที่ไม่ดีมากมายที่นี่ listเป็น Python ในตัว; ใช้ชื่ออื่นแทนเช่นxyzเช่น ทำไมคุณสร้างรายการในสี่ขั้นตอนเมื่อคุณสามารถทำอย่างใดอย่างหนึ่งคือxyz = [x, y, z]? อย่าใช้รายการแบบขนานใช้ dict แทน ทั้งหมดในทุกวิธีนี้ซับซ้อนมากขึ้นกว่าThatGuyRussell ของ ส่วนสุดท้ายทำไมไม่เข้าใจเช่นกันany(v == 0 for v in (x, y, z))? นอกจากนี้อาร์เรย์ยังเป็นอย่างอื่นใน Python
wjandrea

32

เพื่อตรวจสอบว่าค่าที่มีอยู่ภายในชุดของตัวแปรที่คุณสามารถใช้โมดูล inbuilt และitertoolsoperator

ตัวอย่างเช่น:

การนำเข้า:

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)เพราะoperatorเป็นโมดูล inbuilt และเร็วกว่าและมีประสิทธิภาพมากกว่าการใช้lambdaซึ่งต้องสร้างฟังก์ชันแบบแทนที่เอง

ตัวเลือกอื่นสำหรับการตรวจสอบว่ามีค่าที่ไม่ใช่ศูนย์ (หรือเท็จ) ในรายการ:

not (x and y and z)

เทียบเท่า:

not all((x, y, z))

2
นี่ไม่ได้ตอบคำถามของ OP ครอบคลุมเฉพาะกรณีแรกในตัวอย่างที่ให้ไว้
wallacer

31

Set เป็นแนวทางที่ดีที่นี่เพราะมันสั่งให้ตัวแปรสิ่งที่ดูเหมือนจะเป็นเป้าหมายของคุณที่นี่ {z,y,x}เป็น{0,1,3}สิ่งที่ลำดับของพารามิเตอร์

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

วิธีนี้ทางออกทั้งหมดคือ O (n)


5
คุณควรเพิ่มคำอธิบายว่ารหัสของคุณสำเร็จและเป็นอย่างไร คำตอบสั้น ๆ ที่ใช้รหัสเพียงอย่างเดียวนั้นไม่ได้รับการสนับสนุน
Raniz

31

คำตอบที่ยอดเยี่ยมทั้งหมดที่มีให้ที่นี่มุ่งเน้นที่ความต้องการเฉพาะของโปสเตอร์ต้นฉบับและมุ่งเน้นไปที่การif 1 in {x,y,z}แก้ปัญหาที่นำเสนอโดย Martijn Pieters
สิ่งที่พวกเขาไม่สนใจคือความหมายของคำถามที่กว้างขึ้น:
ฉันจะทดสอบตัวแปรหนึ่งตัวต่อค่าหลายค่าได้อย่างไร
วิธีการแก้ปัญหาที่ให้ไว้จะไม่ทำงานสำหรับการเข้าชมบางส่วนหากใช้สตริงตัวอย่างเช่น:
ทดสอบว่าสตริง "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ผสมอยู่ในรายการ แต่ไม่รวมอยู่ในคำเดียว การทดสอบสำหรับ "เน่า" จะล้มเหลว แต่ถ้าหนึ่งในรายการคือ "เน่าในนรก" นั่นก็จะล้มเหลวเช่นกัน
สิ่งที่น่าสนใจให้ระวังกับเกณฑ์การค้นหาของคุณหากใช้วิธีนี้และระวังว่ามันมีข้อ จำกัด นี้


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

30

ถ้าคุณต้องการใช้ถ้าอื่นคำสั่งต่อไปนี้เป็นทางออกอื่น:

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)



12

คุณสามารถลองวิธีที่แสดงด้านล่าง ในวิธีนี้คุณจะมีอิสระในการระบุ / ป้อนจำนวนตัวแปรที่คุณต้องการป้อน

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


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 (คือ 'c'):

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

ใช้คณิตศาสตร์หากสูตรhttps://youtu.be/KAdKCgBGK0k?list=PLnI9xbPdZUAmUL8htSl6vToPQRRN3hhFp&t=315

[ค]: (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เป็นผลิตภัณฑ์ของสมการ

และคุณจะได้ยอดรวมสมการทั้งหมดและคุณมีสูตรรวม

ดังนั้นผลรวม & 1 คือ c, ผลรวม & 2 คือ d, ผลรวม & 4 คือ e, ผลรวม & 5 คือ f

หลังจากนี้คุณอาจสร้างอาร์เรย์ที่กำหนดไว้ล่วงหน้าซึ่งดัชนีขององค์ประกอบสตริงจะสอดคล้องกับสตริงพร้อม

array[sum] ให้สตริง



6

วิธีช่วยในการจำรหัสหลอกของคุณใน 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")

1
วิธีนี้เป็นวิธีที่เป็นสากลมากกว่า `ถ้า 2 ใน (x, y, z): mylist.append ('e')` เพราะอนุญาตให้ทำการเปรียบเทียบโดยพลการ (เช่นif any(v >= 42 for v in (x, y, z)):) และประสิทธิภาพการทำงานของทั้ง 3 วิธีการ ( 2 in {x,y,z}, 2 in (x,y,z), any(_v == 2 for _v in (x,y,z))) ดูเหมือนว่าจะมีเกือบจะเหมือนกันใน CPython3.6 (ดูกระทู้ )
imposeren

5

หากต้องการทดสอบหลายตัวแปรด้วยค่าเดียว: if 1 in {a,b,c}:

วิธีทดสอบหลายค่าด้วยตัวแปรเดียว: if a in {1, 2, 3}:


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

2

คุณสามารถใช้พจนานุกรม:

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

1
สิ่งนี้อาจเพิ่มมากขึ้นอีกครั้ง ตั้ง?
Sergei

2

หากไม่มี dict ให้ลองวิธีนี้:

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

และให้:

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

0

สิ่งนี้จะช่วยคุณ

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

0

คุณสามารถรวมกันนี้

x = 0
y = 1
z = 3

ในตัวแปรเดียว

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

0

ปัญหา

ในขณะที่รูปแบบการทดสอบหลายค่า

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

ในขณะที่นิพจน์นี้ส่งกลับผลลัพธ์ที่ถูกต้องมันไม่สามารถอ่านได้เหมือนกับนิพจน์แรก :-(

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.