web-dev-qa-db-ja.com

リスト内のif/else?

Pythonで次のことができますか?

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

基本的に

  1. すべてのNoneを空の文字列に置き換えます。
  2. 機能を実行します。
662
AP257

あなたはそれを完全に行うことができます、それは単なる注文の問題です:

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

一般に、

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

また、if条件のみを使用したリスト内包表記の場合、

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

これは実際には別の言語構成要素 条件式 を使用しますが、これ自体は 理解構文 の一部ではありませんが、for…inの後のifは一部ですリスト内包表記で、ソース反復可能からのfilter要素に使用されます。


条件式は、何らかの条件に基づいて2つの式値から選択するあらゆる状況で使用できます。これは、 他の言語に存在する三項演算子?: と同じです。例えば:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
1106
poke

一方通行:

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

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

それならあなたは:

row = map(change, row)

または、ラムダインラインを使用することもできます。

39
Adam Vandenberg

これは別の実例です。

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

if i0に対してFalseと評価され、関数range()によって生成された他のすべての値に対してTrueと評価されるという事実を悪用します。したがって、リスト内包表記は次のように評価されます。

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
35
Bengt

特定の問題は以前の回答ですでに解決されているので、リスト内包内で条件式を使用するという一般的な考え方を取り上げます。

これは、リスト内包の中に条件式を書く方法を示す例です。

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

X_non_strの最初のリスト内包表記では、順序は次のとおりです。

for 項目 in 反復可能 if 条件

X_str_changedの最後のリスト内包表記では、順序は次のとおりです。

式1 if 条件 else 式2 for item in 反復可能

expresseion1 ifの前に、 expression2 elseの後に置く必要があることを覚えておくのは難しいと思います。私の頭は両方が前か後のどちらかであることを望みます。

私はそれが普通の言語に似ているのでそのように設計されていると思います。 "私はif雨の中にいたい、else私は外に行きたい"

23

他の解決策は、単一のif/else構文に最適です。ただし、リスト内包内の3項ステートメントは、間違いなく読むのが困難です。

関数を使用すると読みやすくなりますが、マッピングが入力であるワークフローでこのようなソリューションを拡張したり適応させることは困難です。辞書はこれらの懸念を軽減することができます。

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', '']
4
jpp

「イテラブルのアイテムからリストを作成する」

質問に具体的な回答を与えるのではなく、可能なすべてのフォームを最初に一般化するのが最善のようです。そうしないと、読者は答えがどのように決定されたかを知ることができません。最後の形式で最後のelse節を使用できるかどうかを判断しようと頭痛がする前に考えた一般的な形式をいくつか示します。

[反復可能なアイテムの式1(アイテム)]

[反復可能なアイテムの条件1の場合は式1(アイテム)]

[条件1の場合は式1(アイテム)、反復可能の項目の場合は式2(アイテム)]

[条件式1の場合は式1(項目)、条件式2の場合は反復可能な項目の式2(項目)]

「item」の値は、どの条件節でも使用する必要はありません。 「condition3」は、出力リストに値を追加するかどうかのスイッチとして使用できます。

たとえば、文字列の元のリストから空の文字列または空白文字列を削除する新しいリストを作成するには、次のようにします。

newlist = [s.strip()の場合、firstlistのsのs]

0
Hewey Dewey

if/then/elseの場合、3進数は不要です。私の意見ではあなたの質問はこの答えを求めている:

row = [unicode((x or '').strip()) for x in row]
0
mariotomo