2016-11-04 6 views
-2

これは1行で行うことができますが、私はやり方を見つけることができません。これはPythonで1行で実行できますか?

# final_list is what I want as an output 
final_list = [] 

for x in some_list: 
    # y is a dictionary 
    y = x.get_some_dict() 

    # Want to add a new key/value pair to y, which comes from x 
    y.update({"new_key": x.property_in_x}) 
    # append y to the output list 
    final_list.append(y) 

return final_list 
+3

私はより良い質問は、なぜあなたは完全に取るしようとしていると思います良いコードと1つに、おそらく読めない、ラインを詰め込む。 – csmckelvey

+1

'dict.update'のためにこれを1行で行うのは難しいでしょう。恐らくはあまり読みにくいでしょう。 – jonrsharpe

+1

ライナーがより良いコードを作るための考え方の罠に陥ることはありません。このコードは完全にうまくいき、1つの行に詰め込む正当な理由はありません。 –

答えて

2

これを1行のリストの理解に集約することはお勧めしません。それはできますが、それは悪いスタイルです。リスト内包表記には副作用があってはなりません(つまり、updateを呼び出します)。

ジェネレータで追加している明示的なリストを置き換えることができます。それは悪い考えではないでしょう。 d[k] = vd.update({k: v})より簡単です。以下は

def final_list(some_list): 
    for x in some_list: 
     y = x.get_some_dict() 
     y["new_key"] = x.property_in_x 
     yield y 
+0

あなたはOPに "正解"を与えたのでアップアップされました。 _彼のコードを一つの行に圧縮する必要はありません_。 –

0

としてforループとともに同等リスト内包式です:

final_list = [x.get_some_dict() for x in some_list] 
for dict_item, base_item in zip(final_list, some_list): 
    dict_item["new_key"] = base_item.property_in_x 
+0

その結果が 'None'sでいっぱいのリストであることを除いて同等です。 – jonrsharpe

+0

@jonrsharpe:私はそれを見逃して本当に馬鹿だと感じています。大惨事!それを更新しました –

0

は、私は(おそらく)汚いと読めないだろうこれ、1つのライナーにそれを減衰お勧めしません。また、updateは、1つのライナーソリューションに問題があります。

しかし、私の意見では、これはより明確にするために、単純化することができる。 (短縮ではなく読めなく1つのライナーに)

for x in some_list: 
    x.get_some_dict().update({"new_key": x.property_in_x}) 
final_list = [y.get_some_dict() for y in some_list] 
+1

'x.get_some_dict()'が呼び出されるたびに 'dict'型の新しいオブジェクトを返したらどうなるでしょうか? –

+0

@anonymous良い点。しかし、それがした場合、それは言及されている必要があります –

+0

私の意見はそれの反対です。もしそうなら、言及すべきである。 'x.get_some_dict()'のような関数を作成している間は、これからクラスのプロパティを返すことはほとんどありません。 –

関連する問題