if / else na liście

Jak mogę wykonać następujące czynności w Pythonie?

row = [unicode(x.strip()) for x in row if x is not None else '']

Zasadniczo:

  1. Zastąp wszystkie Nony pustymi ciągami, a następnie
  2. wykonaj funkcję.
Author: Peter Mortensen, 2010-11-23

11 answers

Możesz to zrobić. To tylko kwestia zamówienia:

[unicode(x.strip()) if x is not None else '' for x in row]

Ogólnie,

[f(x) if condition else g(x) for x in sequence]

I, dla listy składającej się tylko z if Warunków,

[f(x) for x in sequence if condition]

Zauważ, że w rzeczywistości używa się innego konstruktu językowego, warunkowego wyrażenia, które samo w sobie nie jest częścią składni rozumienia , podczas gdy if po for…in jest częścią składni list i używane do filtrowania elementów ze źródła iterable.


Wyrażenia warunkowe mogą być używane we wszystkich sytuacjach, w których chcesz wybrać pomiędzy dwiema wartościami wyrażeń na podstawie jakiegoś warunku. Działa to tak samo jak operator trójkowy ?:, który istnieje w innych językach . Na przykład:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
 1816
Author: poke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-22 14:10:13

Konkretny problem został już rozwiązany w poprzednich odpowiedziach, więc poruszę ogólną ideę korzystania z warunkow wewnątrz list comprehensions.

Oto przykład, który pokazuje, jak warunkowe mogą być zapisane wewnątrz listy:

X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list

# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning

# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

Zauważ, że na pierwszej liście dla X_non_str Kolejność jest następująca:

wyrażenie na pozycja W iterable if warunek

I na ostatniej liście dla X_str_changed kolejność jest następująca:

ekspresja1 jeśli Stan else ekspresja2 na pozycja W iterable

Zawsze trudno mi pamiętać, że ekspresja1 musi być przed if i ekspresja2 musi być po else. My head wants both to be albo przed, albo po.

Myślę, że jest tak zaprojektowany, ponieważ przypomina normalny język, np. "chcę zostać w środku jeśli pada deszcz, else {[16] } chcę wyjść na zewnątrz"

W prostym języku angielskim dwa wymienione powyżej typy zestawień list można określić jako:

Tylko if:

extract_apple na jabłko W apple_box if apple_is_ripe

I z if/else

mark_apple jeśli apple_is_ripe else leave_it_unmarked na jabłko W apple_box

 47
Author: Tim Skov Jacobsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-15 08:33:25

W Jedną Stronę:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

Chociaż wtedy masz:

row = map(change, row)

Lub możesz użyć lambda inline.

 45
Author: Adam Vandenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-23 20:00:19

Oto kolejny przykład:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

Wykorzystuje fakt, że if i ocenia na False dla 0 i na True dla wszystkich innych wartości generowanych przez funkcję range(). Dlatego lista jest oceniana w następujący sposób:

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
 41
Author: Bengt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 17:09:16

Inne rozwiązania są świetne dla pojedynczego if / else konstruuj. Jednak trójargumentowe stwierdzenia w obrębie listy są prawdopodobnie trudne do odczytania.

Korzystanie z funkcji ułatwia czytelność, ale takie rozwiązanie jest trudne do rozszerzenia lub dostosowania w obiegu pracy, w którym mapowanie jest wejściem. Słownik może złagodzić te obawy:

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']
 8
Author: jpp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 10:24:30

Ma to związek z tym, jak wykonuje się zrozumienie listy.

Należy pamiętać, co następuje:

[ expression for item in list if conditional ]

Jest równoważne:

for item in list:
    if conditional:
        expression

Gdzie {[4] } jest w nieco innym formacie(pomyśl o zmianie kolejności podmiotu i czasownika w zdaniu).

Dlatego Twój kod [x+1 for x in l if x >= 45] robi tak:

for x in l:
    if x >= 45:
        x+1

Jednak ten kod [x+1 if x >= 45 else x+5 for x in l] robi to (po przestawianiu expression):

for x in l:
    if x>=45: x+1
    else: x+5
 4
Author: arboc7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-01 17:36:38

Tworzenie listy z elementów w iterable

Wydaje się, że najlepiej najpierw uogólnić wszystkie możliwe formy, a nie udzielać konkretnych odpowiedzi na pytania. W przeciwnym razie czytelnik nie będzie wiedział, w jaki sposób ustalono odpowiedź. Oto kilka uogólnionych form, które wymyśliłem, zanim dostałem bólu głowy, próbując zdecydować, czy ostateczna klauzula else może być używana w ostatniej formie.

[expression1(item)                                        for item in iterable]

[expression1(item) if conditional1                        for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable]

[expression1(item) if conditional1 else expression2(item) for item in iterable if conditional2]

Wartość item nie musi być używana w żadnej z klauzul warunkowych. A conditional3 może być używany jako przełącznik do dodawania lub nie dodawania wartości do listy wyjściowej.

Na przykład, aby utworzyć nową listę, która eliminuje puste łańcuchy lub białe znaki z oryginalnej listy łańcuchów:

newlist = [s for s in firstlist if s.strip()]
 1
Author: Hewey Dewey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-22 14:13:20

Możesz to zrobić

row = [unicode(x.strip()) if x != None else '' for x in row]

Niektóre składnie do rozumienia listy:

[item if condition else item for item in items]
[f(item) if condition else value for item in items]
[item if condition for item in items]
[value if condition else value1 if condition1 else value2]
 1
Author: MD. ABU SAYED,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-26 11:49:16

Nie ma potrzeby stosowania ternary if / then / else. Moim zdaniem twoje pytanie wymaga tej odpowiedzi:

row = [unicode((x or '').strip()) for x in row]
 0
Author: mariotomo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-22 14:12:22

Można łączyć logikę warunkową w sposób zrozumiały:

 ps = PorterStemmer()
 stop_words_english = stopwords.words('english')
 best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
 bestwords = set([w for w, s in best])


 def best_word_feats(words):
   return dict([(word, True) for word in words if word in bestwords])

 # with stemmer
 def best_word_feats_stem(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords])

 # with stemmer and not stopwords
 def best_word_feats_stem_stop(words):
   return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])
 0
Author: Max Kleiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-27 15:29:44
# coding=utf-8

def my_function_get_list():
    my_list = [0, 1, 2, 3, 4, 5]

    # You may use map() to convert each item in the list to a string, 
    # and then join them to print my_list

    print("Affichage de my_list [{0}]".format(', '.join(map(str, my_list))))

    return my_list


my_result_list = [
   (
       number_in_my_list + 4,  # Condition is False : append number_in_my_list + 4 in my_result_list
       number_in_my_list * 2  # Condition is True : append number_in_my_list * 2 in my_result_list
   )

   [number_in_my_list % 2 == 0]  # [Condition] If the number in my list is even

   for number_in_my_list in my_function_get_list()  # For each number in my list
]

print("Affichage de my_result_list [{0}]".format(', '.join(map(str, my_result_list))))

(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]
 -2
Author: Trop Freshloïc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-20 14:39:30