我有一些可能返回单个 int 或列表的代码。当它返回一个 int 时,我需要将它转换为一个只包含 int 的列表。
我尝试了以下方法,但它不起作用:
newValue = list(retValue)
显然我不能这样做list(some 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]
if isinstance(x,list): return x
else: return [x]
就是这样。
当然,这不会智能地处理其他可迭代类型,但不清楚您是否希望将所有可迭代对象视为列表(也许你这样做,也许你不这样做)。
尝试将变量转换为 int。如果它已经是一个 int 这就是一个空操作。如果它是一个列表,那么这会引发一个 TypeError。
try:
return [int(x)]
except TypeError:
return x
尽管如果异常情况发生的概率很高,则通常不赞成使用异常进行流量控制。这是因为处理异常是一项相当漫长的任务。
另一种方法是使用isinstance
运算符。
if isinstance(x, list):
return x
else:
return [x]
listInt = intVal if isinstance(intVal,list) else [intVal]
如果 value 不是列表,这将始终返回一个列表。希望这可以帮助
这实际上只是Hugh Bothwell答案的一个变体,但是......如果你想要最先进的鸭子类型,你可以hasattr(rval, '__iter__')
在一个更有吸引力的包中获得语义isinstance(rval, collections.Iterable)
。所以...
def wrap_in_iterable(x):
if isinstance(x, collections.Iterable):
return x
else:
return [x]
另外,也许您想要一个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
检查的s。
最后,冒着无聊的风险——如果你可以控制返回函数,尽可能只返回一个单项列表。