2

Python で次のリスト内包表記を作成しました。

[int(a[0].internal_value).lower() if type(a[0].internal_value) in (str,unicode) and a[0].internal_value.isdigit() == True
 else str(a[0].internal_value).lower() if type(a[0].internal_value) in (str,unicode)
 else int(a[0].internal_value) if type(a[0].internal_value) in (float,int)
 for a in ws.iter_rows() if a[0].internal_value <> None]

条件の場合、最後のelseを構築しようとして問題が発生しています:

else int(a[0].internal_value) if type(a[0].internal_value) in (float,int)

その行で if 条件を使用すると、無効な構文が得られます。

 if type(a[0].internal_value) in (float,int)

if文を削除すると

else int(a[0].internal_value)

その後、うまくいくようです。そこにif文が必要です。

私にとって、条件がリスト内包表記である場合は、より単純な if、else 条件を実行する方法です。

if i == x:
  do something
elif i == y:
  do something
elif i == z:
  do something

原則として、一連の条件文を閉じるために常に「else」を使用する必要はありません。私のコードでは、理解の中で最後の「else」が必要なようです。そうであれば、最終的なelseの代わりにpythonリスト内包表記の場合、最終的なelseを構築する方法はありますか?

4

2 に答える 2

10

条件式を(ab) 使用しています。形式は である必要true_expression if test else false_expressionがあります。これらの式は、複合ステートメントとは異なり、常に値を生成します。if

をテストしないでください== True。ブール式は、そのテストなしですでに true または false です。どちらも使用しない<>でください。その演算子は廃止され、Python 3 から完全に削除されました。Noneただし、シングルトンをテストする場合は、 is not None.

type()結果に対してテストしています。代わりにisinstance()テストを使用したいようです。

また、値を使用してから、結果int()を呼び出しています。.lower()メソッドがないint.lower()ため、これらの呼び出しは . で失敗しますAttributeError

intfloatstrまたはよりも多くのタイプがない限り、次のようにすれば問題なく動作しますunicode

[int(a[0].internal_value) if isinstance(a[0].internal_value, (float, int)) or a[0].internal_value.isdigit() 
 else str(a[0].internal_value).lower()
 for a in ws.iter_rows() if a[0].internal_value is not None]

ただし、代わりにフィルター関数への変換を実行します。

def conversion(value):
    if isinstance(value, (float, int)):
        return int(value)
    return str(value).lower()

次に、それをリスト内包表記で使用します。

[conversion(a[0].internal_value) for a in ws.iter_rows() if a[0].internal_value is not None]
于 2013-10-18T22:07:23.257 に答える