2016-03-27 7 views
4

リストの構造を維持しながらリスト内の各要素を2倍する関数を書くにはどうすればよいですか?例えばpython list:構造体を維持しながらリスト内の各要素を2倍にする

:しかし

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 

注、このソリューションその 'listifies' イテレート可能オブジェクトのすべての種類:

f([1, [2, [3]]]) => [2, [4, [6]]] 

答えて

4

シンプルなアプローチがある可能性があります。などのリスト、タプル、セット、のいずれかの入れ子構造を扱うことができるので、あなたのイテラブルの種類を維持し、より洗練されたバージョンは、tryブロック内の行必要があります:

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

これは、インスタンス化をし、オブジェクトを返します。 liの元の型(リスト、タプルなど)のリスト(Py2)またはすべての2倍の要素のマップオブジェクト(Py3)はliです。

+1

私は'map()'はPython 2のように 'list'ではなく' map() 'オブジェクトをPython 3で返します。 – TigerhawkT3

+0

Ahは、企業が拘束しているPython 2.7ユーザーとして、ニュアンスは私を逃す。再びThx;) – schwobaseggl

2

リストだけのリストや数字であることを保証することができれば、あなたがこれを行うことができます:

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

引数は任意の反復可能なことができれば、あなたがこれを行うことができます:

from collections import Iterable 
def double(numberlist): 
    return [double(x) if isinstance(x, Iterable) else x * 2 for x in numberlist] 
関連する問題