12

次のコードを使用して、Pythonでネストされたリストをマップし、同じ構造のリストを作成します。

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]

これは、リスト内包表記のみで(マップ関数を使用せずに)実行できますか?

4

5 に答える 5

15

ネストされたリストの場合、ネストされたリスト内包表記を使用できます。

nested_list = [[s.upper() for s in xs] for xs in nested_list]

個人的にはmap、ほとんどの場合リスト内包表記を好みますが、この状況ではよりクリーンであることがわかります。どちらも機能するので、それは本当にあなたの呼び出しです。

于 2009-08-20T14:45:39.300 に答える
4

Zen of Python を思い出してください。

一般に、それを行う明白な方法は複数あり、おそらく複数あります。**

** 注: 正確を期すために編集されています。

とにかく地図が好き。

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )
于 2013-03-14T20:12:07.093 に答える
3

マップは確かにあなたが望むことをするためのはるかにクリーンな方法です。リスト内包表記をネストすることはできますが、それがあなたが求めているものかもしれません。

[[ix.upper() for ix in x] for x in nested_list]
于 2009-08-20T14:47:07.677 に答える
2

これは、任意の深さを持つネストされたリストのソリューションです。

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を初めて使用します。お気軽に議論してください!

于 2014-10-01T03:31:47.853 に答える
1

他の投稿者が答えを出していますが、機能的な構造に頭を悩ませているときはいつでも、私はプライドを飲み込み、明示的に最適ではない方法やオブジェクトを手書きで綴ります。あなたはジェネレーターで終わりたいと言ったので、次のようになります。

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 のイディオムの方がわかりやすいかもしれません。

于 2009-08-20T21:50:24.950 に答える