Czy można to zrobić w jednym wierszu w Pythonie?
if <condition>:
myList.append('myString')
Wypróbowałem operator trójskładnikowy:
myList.append('myString' if <condition>)
ale moje IDE ( MyEclipse ) nie podobało się, bez pliku else
.
Czy można to zrobić w jednym wierszu w Pythonie?
if <condition>:
myList.append('myString')
Wypróbowałem operator trójskładnikowy:
myList.append('myString' if <condition>)
ale moje IDE ( MyEclipse ) nie podobało się, bez pliku else
.
Odpowiedzi:
Tak, możesz to zrobić:
<condition> and myList.append('myString')
Jeśli <condition>
jest fałszywe, włączy się zwarcie, a prawa strona nie zostanie oceniona. Jeśli <condition>
jest prawdziwe, zostanie oceniona prawa strona, a element zostanie dołączony.
Zaznaczę tylko, że zrobienie powyższego jest całkiem nie-pythonowe i prawdopodobnie najlepiej byłoby napisać to, niezależnie od:
if <condition>: myList.append('myString')
Demonstracja:
>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']
E701 multiple statements on one line
więc także nie-pythonowy ...;)
x = object.get('attribute')
w tym przypadku
Powód, dla którego język nie pozwala na użycie składni
variable = "something" if a_condition
bez else
jest to, że w przypadku a_condition == False
, gdy variable
nagle jest nieznane. Może mogłoby tak być domyślnie None
, ale Python wymaga, aby wszystkie przypisania zmiennych w rzeczywistości skutkowały jawnymi przypisaniami. Dotyczy to również przypadków, takich jak wywołania funkcji, jako wartość przekazana do funkcji jest oceniany tak jak RHS instrukcji przypisania będzie.
Podobnie, wszystkie return
s muszą faktycznie powrócić, nawet jeśli są warunkowe return
. Na przykład:
return variable if a_condition
nie jest dozwolone, ale
return variable if a_condition else None
jest dozwolone, ponieważ drugi przykład gwarantuje, że jawnie coś zwróci.
variable=None
jest żadna, ale jest całkowicie legalna. : D
continue if i == 0
w pętli for.
else pass?
else pass
nie działa, ponieważ wyrażenie trójargumentowe powinno zwracać wartość, do której można przekazać return
. pass
nie jest prawidłową return
wartością.
if a_condition: variable = "something"
i if a_condition: return variable
są legalne. Jest to więc zasadniczo arbitralny wybór składniowy języka Python.
if <condition>: myList.append('myString')
W przeciwnym razie nie. Dlaczego trzeba umieścić to w jednej linii?
Zauważ, że „operator trójskładnikowy” to operator . Jak każdy operator, musi coś zwrócić , więc jak można mieć operator trójskładnikowy bez else
klauzuli? Co ma zwrócić, jeśli warunek nie jest prawdziwy?
Zasadniczo prosisz o do_thing() if <condition> else pass
konstrukt (który wyrzuci SyntaxError
, jeśli zostanie uruchomiony). Jak odkryłem podczas badań, podobne pytanie (nieco) do_thing() if condition else None
jest tak bliskie, jak tylko możesz (co jest po prostu innym sposobem <condition> and do_thing()
). Podsumowując ten pomysł i inne odpowiedzi, oto opcje:
if <condition>: myList.append('myString')
- wydaje się najmniej „hacky” (a zatem preferowany) sposób<condition> and myList.append('myString')
myList.append('myString') if <condition> else None
myList.extend(['myString'] if condition else [])
również zadziała, chociaż to więcej pracy niż inne rozwiązania.
Możesz zrobić coś takiego:
myList.append('myString') if <condition> else False
lub
myList.append('myString') if <condition> else 0
myList.append('myString') if True else _
ale jeśli nie przypisujesz niczego, nie ma to znaczenia. Martwię się jednak, że ta osoba próbuje zrozumieć listę z podobną logiką.
Zrobiłbym to po prostu, jeśli chcę dodać opcjonalne elementy do listy na podstawie warunku.
nums = [
1,
2,
3 if <condition> else None,
4,
]
nums = [i for i in nums if i is not None]
to po prostu zastępuje wartość wartością Brak, jeśli warunek nie jest spełniony, a następnie po prostu ponownie definiuje listę bez wartości Brak. w ten sposób zachowują swój indeks, jeśli warunek jest spełniony