如何将int转换为列表?

时间:2012-07-10 21:42:22

标签: python list

我有一些代码可能会返回单个int或列表。当它返回一个int时,我需要将它转换为只包含int的列表。

我尝试了以下操作,但它不起作用:

newValue = list(retValue)

显然我不能list(some int)因为int不可迭代。还有另一种方法吗?

提前致谢!

6 个答案:

答案 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.Sequencecollection.Iterable定义__subclasshook__来执行相应的hasattr检查。

最后,冒着无聊的风险 - 如果你能控制返回的功能,只要有可能就返回一个项目列表。