2017-12-11 2 views
-1

私は自分のproject.Nowのpython2でPython2からPython3に移行したいと思っていました。私は文法エラーを取得しています。以下に示すforループコードスニペットを記述しています。私はどこが間違っているのか混乱しています。Python 3でのLambdaソート

コード:

for k, val in sorted(datasource_columns.iteritems(), key=lambda(
          k, v): sort_order.index(k)): 
         # columns.add_column(key, sorted(val)) 
         columns.add_column(k, val) 

SORT_ORDERは= [ '名前'、 'データタイプ'、 'タイプ'、 'ロール']

+2

投稿に実際のエラーを含めてください。 – Galen

+6

'sort_order.index(k)'は非常に非効率なソートキーのように聞こえます... –

答えて

1

として既にiteritems()になり、前記問題はありますが、括弧の付いたlambda宣言の構文エラーがあります。

変更:

key=lambda(k, v): sort_order.index(k) 

key=lambda k, v: sort_order.index(k) 

しかし、あなたにもこのより効率的なコード書くことがあります。将来的には

for key in sort_order: 
    val = datasource_columns.get(key) 
    if val is not None: # to avoid getting None values in your columns 
     columns.add_column(key, val) 

をあなたが例外を取得するたびに、実際のスタックトレースを投稿してください、これは作ります問題を理解するのがずっと簡単です。

+0

あなたのより効率的なコードは、 'datasource_columns'に存在しない' sort_order'のキーがあるかもしれません。あなたのコードはそのようなキーの '(key、None)'項目を作成します。それは望ましくないかもしれません。 –

+0

確かに、それは、もし必要なら、 'もしvalがNone:ではない'ステートメントで簡単に修正できます。 – Guillaume

+0

確かに!だから、その情報をあなたの答えに加えるべきです。そして、おそらく元のキー機能がとても恐ろしい理由を言及する価値があるでしょう。 –

0

正確に変更された内容はわかりませんが、lambda (k, v): sort_order.index(k)はpython3の構文が無効です。代わりにlambda k, v: sort_order.index(k)を使用できます。