次のようなリストがあるとします。
li = ['0', ['1', '2'], ['3', ['4', '5'], '6', ['7'], '8'], '9']
int
Pythonic の方法でリスト内のすべての要素に関数 (たとえば ) を適用するにはどうすればよいですか?
例:
>>> func_on_all(li, int)
[0, [1, 2], [3, [4, 5], 6, [7], 8], 9]
この機能を使用できます:
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)
これにより、リスト以外のネストされたコレクション (タプルなど) を使用できるようになり、リストで呼び出す独自の関数を指定できます。
最初の質問のワンライナー:
f = lambda obj, el_func: [f(el, el_func) for el in obj] if isinstance(obj, list) else el_func(obj)
f(li, int)
私は私のバージョンが好きです:)
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
:)
ここに別のものがあります:
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)