次のコードを使用して、Pythonでネストされたリストをマップし、同じ構造のリストを作成します。
>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]
これは、リスト内包表記のみで(マップ関数を使用せずに)実行できますか?
次のコードを使用して、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
、ほとんどの場合リスト内包表記を好みますが、この状況ではよりクリーンであることがわかります。どちらも機能するので、それは本当にあなたの呼び出しです。
Zen of 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]
これは、任意の深さを持つネストされたリストのソリューションです。
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']]]]
さらに重要なことに、この再帰関数はこれ以上のことができます!
私はPythonを初めて使用します。お気軽に議論してください!
他の投稿者が答えを出していますが、機能的な構造に頭を悩ませているときはいつでも、私はプライドを飲み込み、明示的に最適ではない方法やオブジェクトを手書きで綴ります。あなたはジェネレーターで終わりたいと言ったので、次のようになります。
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)
場合によっては、手書きバージョンのいずれかを保持する方がクリーンです。私にとっては、map と reduce の方がわかりやすい場合もありますが、他の人にとっては Python のイディオムの方がわかりやすいかもしれません。