2016-03-27 5 views

Antwort

4

Ein einfacher Ansatz könnte sein:

def double(li): 
    try: 
     return [double(x) for x in li] 
    except: # li is not iterable, recursion base case 
     return 2*li # or sth. else for non-numerical, non-iterable types 

Beachten Sie jedoch, dass diese Lösung 'listifies' alle Arten von Iterables. Eine anspruchsvollere Version, die die Typen Ihres Iterables unterhält, kann somit jede verschachtelte Struktur von Listen handhaben, Tupel, Mengen, usw. würde diese Zeile im Try-Block:

return type(li)(map(double, li)) # should work in Python 2 and 3 

Diese instanziiert und gibt ein Objekt von li Originaltyp (Liste, Tupel, etc.) mit einer Liste (Py2) oder ein Kartenobjekt (Py3) aller verdoppelten Elemente in li.

+1

I empfehlen, das Verständnis beizubehalten, da 'map()' ein 'map()' -Objekt in Python 3 anstatt einer 'list' wie in Python 2 zurückgibt. – TigerhawkT3

+0

Ah sehe ich als unternehmensbeherrschter Python 2.7-Benutzer Nuancen entziehen sich mir. Thx nochmal;) – schwobaseggl

2

Wenn Sie garantieren können, dass die Liste nur Listen und Zahlen sein, Sie können dies tun:

def double(numberlist): 
    return [double(x) if isinstance(x, list) else x * 2 for x in numberlist] 

Wenn das Argument jede iterable sein könnte, können Sie dies tun:

from collections import Iterable 
def double(numberlist): 
    return [double(x) if isinstance(x, Iterable) else x * 2 for x in numberlist] 
Verwandte Themen