1

次のようなリストがあるとします。

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']

intPythonic の方法でリスト内のすべての要素に関数 (たとえば ) を適用するにはどうすればよいですか?
例:

>>> func_on_all(li, int)
[0, [1, 2], [3, [4, 5], 6, [7], 8], 9]
4

4 に答える 4

3

この機能を使用できます:

def to_int(lst):
    for i in lst:
        if isinstance(i, list):
            yield list(to_int(i))
        else:
            yield int(i)

ここにテスト実行があります:

>>> li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
>>> list(to_int(li))
[0, [1, 2], [3, [4, 5], 6, [7], 8], 9]

これは、ネストされたリストに対してのみ機能し、int機能のみを実行できることに注意してください。次のように、関数をより一般的にすることができます。

def deep_map(lst, f=int):  # the parameter `f` is the function
    for i in lst:
        if isinstance(i, collections.Iterable) and not isinstance(i, str):
            yield list(deep_map(i, f))
        else:
            yield f(i)

これにより、リスト以外のネストされたコレクション (タプルなど) を使用できるようになり、リストで呼び出す独自の関数を指定できます。

于 2013-04-04T09:52:52.223 に答える
2

最初の質問のワンライナー:

f = lambda obj, el_func: [f(el, el_func) for el in obj] if isinstance(obj, list) else el_func(obj)
f(li, int)
于 2013-04-04T09:56:57.873 に答える
1

私は私のバージョンが好きです:)

def recursive_map(func, iterable, kind=list):
    if isinstance(iterable, kind):
        return map(lambda x: recursive_map(func, x), iterable)
    else:
        return func(iterable)

関数で使用するクラスに渡しkindます。

ボラティリティに感謝します、忘れましたiter:)

于 2013-04-04T10:02:53.417 に答える
0

ここに別のものがあります:

def deploy(l, out) :

    if isinstance(l, list) :
        for i in l :
            deploy(i, out)
    else :
        out.append(l)


def applyFuncOnMultilevelList(li, func) :
    out = []
    deploy(li, out) 
    for i in out :
        func(i)

li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
applyFuncOnMultilevelList(li, print)  
于 2013-04-04T10:06:57.887 に答える