我有一些代码可能会返回单个int或列表。当它返回一个int时,我需要将它转换为只包含int的列表。
我尝试了以下操作,但它不起作用:
newValue = list(retValue)
显然我不能list(some int)
因为int不可迭代。还有另一种方法吗?
提前致谢!
答案 0 :(得分:9)
定义你自己的功能:
def mylist(x):
if isinstance(x,(list,tuple)):
return x
else:
return [x]
>>> mylist(5)
[5]
>>> mylist([10])
[10]
答案 1 :(得分:7)
在Python中,鸭子打字更可取 - 不要测试特定类型,只测试它是否支持你需要的方法(“我不在乎它是否是鸭子,只要它嘎嘎叫”)。 / p>
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]
答案 2 :(得分:2)
if isinstance(x,list): return x
else: return [x]
就是这样。
当然,这不会智能地处理其他可迭代类型,但是不清楚您是否希望将所有迭代视为列表(可能是您,也许您不这样做)。
答案 3 :(得分:2)
尝试将变量转换为int。如果它已经是一个int,那么这是一个无操作。如果它是一个列表,则会引发TypeError。
try:
return [int(x)]
except TypeError:
return x
如果特殊情况发生的可能性很高,通常不会使用流量控制的例外情况。这是因为处理异常是一项相当漫长的任务。
另一种方法是使用isinstance
运算符。
if isinstance(x, list):
return x
else:
return [x]
答案 4 :(得分:2)
listInt = intVal if isinstance(intVal,list) else [intVal]
如果值不是列表,这将始终返回列表。 希望这有帮助
答案 5 :(得分:2)
这实际上只是Hugh Bothwell答案的变体,但是......如果你想要最先进的鸭子打字,你可以更多地获得hasattr(rval, '__iter__')
的语义带有isinstance(rval, collections.Iterable)
的诱人套餐。所以......
def wrap_in_iterable(x):
if isinstance(x, collections.Iterable):
return x
else:
return [x]
另外,也许你想要一个列表,而不仅仅是一个可迭代的;为了获得类似列表的东西,但是消除类似生成器和类似dict的东西,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
检查。
最后,冒着无聊的风险 - 如果你能控制返回的功能,只要有可能就返回一个项目列表。