2016-07-17 15 views
0

私は最近、Python 3.5.2でmap()を使って練習していましたが、モジュールを実行しようとしたときに、関数を区切るカンマとiterableSyntaxErrorでした。ここでは、コードです:この条件文で構文エラーが発生するのはなぜですか?

eng_swe = {"merry":"god", "christmas":"jul", "and":"och", "happy":"gott", 
     "new":"nytt", "year":"år"} 

def map_translate(l): 
    """Translates English words into Swedish using the dictionary above.""" 

    return list(map(lambda x: eng_swe[x] if x in eng_swe.keys(), l)) 

は私が気づいた私はこのような条件文を排除する場合:それが正常に動作しますが、それは上がらないリストに項目を追加しようとしないようにする能力を犠牲に

return list(map(lambda x: eng_swe[x], l)) 

辞書にはありません。

from functools import reduce 

def reduce_max_in_list(l): 
    """Returns maximum integer in list using the 'reduce' function.""" 

    return reduce(lambda x, y: x if x > y else y, l) 

はい、私はリスト内包して、よりきれいに、簡単に正確に同じことを行うことができます知っている:興味深いことに、また、ここに示したように、私は、reduce()で条件文を使用してみました何の問題もありませんでしたしかし、たとえ私がもう一度それを使用することがなくなったとしても、少なくともmap()を正しく使用する方法を学ぶためには時間がかかると思う。

+1

三項演算子には 'else'条件が必要です。 – pzp

答えて

4

else句を指定せずに条件式を使用しているため、SyntaxErrorが得られました。これは必須です。条件式のため

The grammar(表現形式ですなわちif文)常にelse句が含まれます。

conditional_expression ::= or_test ["if" or_test "else" expression] 
                ^^ 

をごreduce例では、それを供給し、その結果としての操作を行い、エラーは発生していません。

4

最初の例では、条件でない場合に返される内容を指定しません。 Python は式から何も得られないので、それは構文エラーです。例えば:

a if b # SyntaxError. 
a if b else c # Ok. 

あなたは暗黙のうちに、この場合にNoneを得有用であろうと主張するかもしれませんが、私はその種の提案は(私はないでしょう...コミュニティ内の任意の牽引力になるだろうことを疑いますそれに投票してください:

1

あなたのコードがなぜSyntaxErrorを引き起こしているのかの他の説明は完全に正確ですが、私の答えの目標は、少なくともmap()を正しく使う方法を学ぶことです。

mapの使用はあまり意味がありません。

[eng_swe[x] for x in l if x in eng_swe] 

は、あなたが見ることができるように、これはあなたのマップの表現にひどく似て、マイナス畳み込みのいくつか:あなたはあなたの答えで述べたように、それはあなたがリストの内包を使用した場合よりクリーンになります。一般に、これはmapを間違って使用しているという兆候です。 map(lambda...はかなり多くのコードの匂いです。 (私はこれをPythonでmapを使用する熱心な支持者と言っていることに注意してください。多くの人が決して使用すべきではないと思いますが、正しく使用されている限り、)

だから、mapを使用する良い例は何ですか?さて、私が頭の上から外すと考えることのできるユースケースの1つはstrのリストをintに変換しています。私は、ファイルに格納されたデータのテーブルを読んでいた場合、私が行う可能性があります。さらに操作や分析のための完璧なint秒、の2次元配列で私を残して

with open('my_file.txt', 'r') as f: 
    data = [map(int, line.split(' ')) for line in f] 

を。これがあなたのコードよりもmapのほうをよく使う理由は、組み込み関数を使用することです。私はラムダを地図で使用するよう明示的に書いているわけではありません(これはあなたがリストの理解を使うべきであるというサインなので)。

コードに戻るには...機能的にコードを書く場合は、実際にfilterを使用する必要があります。これはmapと同様に重要です。

map(lambda x: eng_swe[x], filter(lambda x: eng_swe.get(x), l)) 

私は私のバージョンでmap(lambda...コードのにおいを取り除くことができませんでしたが、少なくとも私は小さな部分にそれを破ったノート。 filterは翻訳可能な単語を検索し、mapは実際の翻訳を実行します。 (この場合でも、リストの理解はおそらく良いでしょう。)この説明が、Pythonコードを機能的に書くためのあなたの探求に混乱させる以上の助けになることを願っています。

+0

私はそれを感謝します。私は条件文を使う方法についての長いガイドを探しましたが、それを見つけることはできませんでした。したがって、この間違いです。 –

関連する問題