単一の int またはリストのいずれかを返すコードがあります。int を返す場合は、int のみを含むリストに変換する必要があります。
次のことを試しましたが、うまくいきません。
newValue = list(retValue)
list(some int)
int はイテラブルではないため、どうやらできないようです。これを行う別の方法はありますか?
前もって感謝します!
独自の関数を定義します。
def mylist(x):
if isinstance(x,(list,tuple)):
return x
else:
return [x]
>>> mylist(5)
[5]
>>> mylist([10])
[10]
Python では、ダック タイピングが推奨されます。特定のタイプをテストするのではなく、必要なメソッドをサポートしているかどうかをテストします (「カモが鳴る限り、ダックかどうかは気にしません」)。
def make_list(n):
if hasattr(n, '__iter__'):
return n
else:
return [n]
a = make_list([1,2,3]) # => [1,2,3]
b = make_list(4) # => [4]
listInt = intVal if isinstance(intVal,list) else [intVal]
値がリストでない場合、これは常にリストを返します。お役に立てれば
これは実際にはHugh Bothwellの答えのバリエーションにすぎませんが、最先端のダック タイピングが必要な場合はhasattr(rval, '__iter__')
、より魅力的なパッケージでのセマンティクスを取得できますisinstance(rval, collections.Iterable)
。そう...
def wrap_in_iterable(x):
if isinstance(x, collections.Iterable):
return x
else:
return [x]
また、iterable だけでなく、 listが必要な場合もあります。リストのようなものを取得するが、ジェネレータのようなものや辞書のようなものを排除するのcollections.Sequence
は便利です。(この関数に無限ジェネレーターを渡さないでください。)
def convert_to_sequence(x):
if isinstance(x, collections.Sequence):
return x
elif isinstance(x, collections.Iterable):
return list(x)
else
return [x]
これらが機能するのは、適切なチェックを実行するcollections.Sequence
および をcollection.Iterable
定義するためです。__subclasshook__
hasattr
最後に、退屈になるリスクがあります。返される関数を制御できる場合は、可能であれば 1 つの項目のリストを返します。
if isinstance(x,list): return x
else: return [x]
それでおしまい。
もちろん、これは他の iterable 型を賢く扱うわけではありませんが、すべての iterable をリストであるかのように扱いたいかどうかは明確ではありません (そうするかもしれませんし、しないかもしれません)。
変数を int に変換してみてください。すでに int である場合、これはノーオペレーションです。リストの場合、これは TypeError を発生させます。
try:
return [int(x)]
except TypeError:
return x
ただし、例外的な状況が発生する可能性が高い場合、フロー制御に例外を使用することは一般的に嫌われます。これは、例外の処理が非常に時間のかかる作業であるためです。
もう 1 つの方法は、isinstance
演算子を使用することです。
if isinstance(x, list):
return x
else:
return [x]