Jak mogę wykonać następujące czynności w Pythonie?
row = [unicode(x.strip()) for x in row if x is not None else '']
Głównie:
- zamień wszystkie Nones na puste ciągi, a następnie
- pełnić funkcję.
python
list-comprehension
AP257
źródło
źródło
Odpowiedzi:
Możesz to zrobić całkowicie. To tylko kwestia zamówienia:
Ogólnie,
I tylko w przypadku list ze zrozumieniem z
if
warunkamiZauważ, że tak naprawdę używa innej konstrukcji języka, wyrażenia warunkowego , które samo w sobie nie jest częścią składni rozumienia , podczas gdy
if
pofor…in
jest częścią wyrażeń listowych i służy do filtrowania elementów ze źródła iterowalnego.Wyrażeń warunkowych można używać we wszystkich sytuacjach, w których chcesz wybierać między dwiema wartościami wyrażeń na podstawie pewnych warunków. Robi to tak samo, jak operator trójskładnikowy,
?:
który istnieje w innych językach . Na przykład:źródło
l = [ 2, 3, 4, 5]
to[x if x % 2 == 0 for x in l]
daj mi błąd, ale[x if x % 2 == 0 else 200 for x in l]
działa. Tak, wiem, żeby to przefiltrować, powinienem napisać[ x for x in l if x % 2 == 0]
. Przepraszam, że przeszkadzam. Dzięki za odpowiedź.Jednokierunkowa:
Chociaż wtedy masz:
Lub możesz użyć liniowego lambda.
źródło
if
wyrażenia lub kodu w jegoelse
bloku instrukcji lub s. Przyjęta odpowiedź jest lepsza w prostych przypadkach.Oto kolejny przykładowy przykład:
Wykorzystuje fakt, że
if i
oceniaFalse
dla0
iTrue
dla wszystkich innych wartości generowanych przez funkcjęrange()
. W związku z tym zrozumienie listy ocenia się następująco:źródło
Konkretny problem został już rozwiązany w poprzednich odpowiedziach, więc zajmę się ogólną ideą używania warunkowych w ramach list.
Oto przykład, który pokazuje, w jaki sposób warunek można zapisać wewnątrz listy:
Zauważ, że w pierwszym zestawieniu listy
X_non_str
kolejność jest następująca:aw ostatnim zestawieniu listy
X_str_changed
kolejność jest następująca:Zawsze trudno jest pamiętać, że expresseion1 musi być wcześniej czy i wyrażenie2 musi być po indziej . Moja głowa chce być zarówno przed, jak i po.
Myślę, że jest zaprojektowany tak, ponieważ przypomina normalny język, na przykład: „Chcę pozostać wewnątrz jeśli pada deszcz, jeszcze chcę wyjść na zewnątrz”
W prostym języku angielskim dwa wyżej wymienione typy list można określić jako:
Tylko z
if
:i z
if/else
źródło
Inne rozwiązania są świetne dla pojedynczego
if
/else
konstruktu. Jednak wyrażenia trójkowe w ramach list są prawdopodobnie trudne do odczytania.Korzystanie z funkcji poprawia czytelność, ale takie rozwiązanie jest trudne do rozszerzenia lub dostosowania w przepływie pracy, w którym mapowanie stanowi dane wejściowe. Słownik może złagodzić te obawy:
źródło
Ma to związek z tym, w jaki sposób wykonywane jest rozumienie listy.
Pamiętaj, że:
Jest równa:
Gdzie
expression
jest w nieco innym formacie (pomyśl o zmianie tematu i kolejności czasowników w zdaniu).Dlatego twój kod
[x+1 for x in l if x >= 45]
robi to:Jednak ten kod
[x+1 if x >= 45 else x+5 for x in l]
robi to (po zmianieexpression
):źródło
Nie ma potrzeby tworzenia trójki, jeśli / to / else. Moim zdaniem twoje pytanie wymaga tej odpowiedzi:
źródło
Wydaje się, że najlepiej najpierw uogólnić wszystkie możliwe formularze, a nie udzielić konkretnych odpowiedzi na pytania. W przeciwnym razie czytelnik nie będzie wiedział, w jaki sposób ustalono odpowiedź. Oto kilka uogólnionych formularzy, które wymyśliłem, zanim dostałem bólu głowy, próbując zdecydować, czy można użyć ostatniej klauzuli „else” w ostatniej formie.
Wartość
item
nie musi być używana w żadnej z klauzul warunkowych. Aconditional3
może służyć jako przełącznik do dodawania lub nie dodawania wartości do listy wyników.Na przykład, aby utworzyć nową listę, która eliminuje puste ciągi lub ciągi spacji z oryginalnej listy ciągów:
źródło
this if condition else that
dozwolone jest tylko wyrażenie normalne. Nievalue = this if condition
(co można osiągnąć za pomocąvalue = this if condition else None
)Możesz połączyć logikę warunkową ze zrozumieniem:
źródło
(venv) $ python list_comp.py
Affichage de my_list [0, 1, 2, 3, 4, 5]
Affichage de my_result_list [0, 5, 4, 7, 8, 9]
Więc dla ciebie:
row = [('', unicode(x.strip()))[x is not None] for x in row]
źródło