2016-12-01 5 views
0

私は次のようにエレガントにしたいと思います。私はリストを持っている:追加機能をリストにマッピング

list1 = [[1,2],[3,1,4,7],[5],[7,8]] 

私は

list1 = [[1,2,1],[3,1,4,7,1],[5,1],[7,8,1]] 

を持っているように、私は

を経由して、これをマップしようとしている、リストの各要素に番号1を追加したいのですが
map(list.append([1]), vectors) 

これはエラーappend() takes exactly one argument (0 given)を返します。(list.なし)を試してみると、NameError: global name 'append' is not definedと表示されます。私はループでそれを行うことができると思いますが、これはよりエレガントなようですが、これを正しくマップする方法はありますか?

+0

for-loopは問題ありません。あなたが本当に望むものがインプレース変異である '.append'にあるならば、マップは完全に間違っています。 –

+0

@DarraghEnrightこれは非常に悪い習慣です。リスト内包は機能的な構造であり、状態の変更を機能的な構造とミックスしていますが、それは悪い形です。 –

+1

インプレース変異を 'map'と混在させることは、エレガントなものとは逆の**です。 –

答えて

1

はあなたが望むものを実装する方法はいくつかあります地図

list1 = map(lambda el: el + [1], list1) 

何を使用すればよいですか?

あなたの状況によって異なりますが、実行速度の最適化、コードの可読性、使用場所によって異なる場合があります。

  • Map読みやすさと実行スピードの場合
  • Forで最悪の選択をするこの
  • Generatorsを行うための最速、より平易な方法は、あなたが本当にこの
  • を必要とする場合にのみ、あなたが新しいリストを生成することができますされ
  • List comprehension - 古典forのための1つのライナーと、すぐにif
を使用して、新しいリストをフィルタリングする必要がある場合には、利用しています

つまり、各項目に要素を追加するだけでよい場合は、forループが最適です。ただし、itemを追加する必要がある場合は、item> 40の場合にのみList comprehensionを使用することをお勧めします。例えば

クラシックFor

x = 41 

for el in list1: 
    if x > 40: 
    el.append(x) 

リスト内包

x = 1 
    list1 = [el + [x] for el in list1 if x > 40] 

@jmd_dkが、このサンプルでは、​​上述したように1つの基本的な違いです:シンプルforであなただけのことができます既存のに追加実行時間とメモリ使用量に与える影響がはるかに小さいリストのリスト。 List comprehensionを使用すると、新しいリストオブジェクトが得られます。この場合は、各アイテムの新しいリストオブジェクトになります。

+0

私はいくつかの 'if'条件を導入しても、リストの理解の方法はここでは良い選択であると私は反対します。式 'el + [1]'は既存のリストに追加されませんが、 'el'と' [1] 'から完全に新しいリストを作成します。 'list1'の大きな要素に対しては、これは必要以上に多くのメモリを使い果たし、ほとんどの時間はこのコピーに費やされます。内部のif文を含む単純なforループが最適なオプションです。 –

+0

ここ@jmd_dkはどこですか?私はそれぞれの事例について説明するために提供し、彼にとって最良のものを決定することができます。私の意見では、単純な 'for'を使うだけで十分です。次に、著者が大規模なデータで動作しない場合、教えていることは重要ではありません。私が話そうとしているすべては、状況や必要条件に依存します。 – Reishin

0

追加リストがそれらを一緒に連結するという事実を利用して、リストの理解を試してください。

new_list = [l + [1] for l in list1] 
0

あなたは、単にあなたがこれを意味

list1 = [[1,2],[3,1,4,7],[5],[7,8]] 
for el in list1: 
    el.append(1) 
+0

はい、これは私が "私はループでそれを行うことができると思います"という意味です。 :) –

0
map(lambda x: x + [1], list1) 

を行うことができますか?

list.append()はリストの内包表記とappend付きノーリターン(常にNoneを返す意味)

0

を持っていない、あなたが行うことができます:

list1 = [[1, 2], [3, 1, 4, 7], [5], [7, 8]] 

[item.append(1) for item in list1] 
print(list1) # Output: [[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]] 

出力:

>>> list1 = [[1, 2], [3, 1, 4, 7], [5], [7, 8]] 
>>> [item.append(1) for item in list1] 
[None, None, None, None] 
>>> list1 
[[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]] 

次のようにextendを使用することもできます。

より読みやすく、古典的な方法

for el in list1: 
    el.append(1) 

リスト内包

list1 = [el + [1] for el in list1] 

ジェネレータ:

list1 = (el + [1] for el in list1) 
ここ
[item.extend([1]) for item in list1] 
print(list1) # Output: [[1, 2, 1], [3, 1, 4, 7, 1], [5, 1], [7, 8, 1]] 
関連する問題