Pythonでリストの内包とネストされたリストのマッピング?
-
19-09-2019 - |
質問
私は同じ構造を有するリストを生成するPythonでネストされたリストをマッピングするために使用する次のコードを有しています。
>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]
この(マップ機能を使用せずに)単独のリスト内包で行うことができますか?
解決
ネストされたリストに、あなたは、ネストされたリストの内包表記を使用することができます
nested_list = [[s.upper() for s in xs] for xs in nested_list]
個人的に私はmap
は、私はほとんど常にリストの内包表記を好むにもかかわらず、このような状況でクリーンであることがわかりました。だから、どちらかが動作することから、本当にあなたの呼び出しです。
他のヒント
はPythonの禅を覚えています:
いくつかのの、おそらく<全角> - -があり、複数のが一般的である。それを行うには明白な方法は**
**注:正確さのために編集
とにかく、私はマップを好むます。
from functools import partial
nested_list = map( partial(map, str.upper), nested_list )
地図は確かにあなたが欲しいものを行うための非常にクリーンな方法です。あなたは巣リスト内包は、しかし、多分それはあなたが後にしている何ができますか?
[[ix.upper() for ix in x] for x in nested_list]
ここのの任意の深さを持っているの のネストされたリストのためのソリューションです
あなたが大文字にすべてのあなたのリスト要素が欲しいだけ入力します。 そして、もっと重要なのは、この再帰関数は、これ以上の操作を行うことができます! 私のpythonに新しいです、議論気軽に!def map_nlist(nlist=nlist,fun=lambda x: x*2):
new_list=[]
for i in range(len(nlist)):
if isinstance(nlist[i],list):
new_list += [map_nlist(nlist[i],fun)]
else:
new_list += [fun(nlist[i])]
return new_list
In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]
他のポスターは答えを与えているが、私は、機能構造のまわりで私の頭をラップトラブルを抱えている時はいつでも、私は自分のプライドを飲み込むと、明示的に非最適な方法および/またはオブジェクトと手書きそれを綴ります。あなたはそう、発電機で終わるしたいと述べます:
for xs in n_l:
def doUpper(l):
for x in l:
yield x.upper()
yield doUpper(xs)
for xs in n_l:
yield (x.upper() for x in xs)
((x.upper() for x in xs) for xs in n_l)
時にはそれは手書きのバージョンのいずれかを維持するクリーナーです。私にとっては、マップや短縮時にはそれがより明確にするが、Pythonのイディオムは、他人のために、より明白かもしれません。