0

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

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

newValue = list(retValue)

显然我不能这样做list(some int),因为整数是不可迭代的。还有另一种方法吗?

提前致谢!

4

6 回答 6

9

定义自己的功能:

 def mylist(x):
    if isinstance(x,(list,tuple)):
        return x
    else:
        return [x]


>>> mylist(5)
[5]
>>> mylist([10])
[10]
于 2012-07-10T21:43:21.360 回答
7

在 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]
于 2012-07-10T21:56:03.390 回答
2
if isinstance(x,list): return x
else: return [x]

就是这样。

当然,这不会智能地处理其他可迭代类型,但不清楚您是否希望将所有可迭代对象视为列表(也许你这样做,也许你不这样做)。

于 2012-07-10T21:49:13.243 回答
2

尝试将变量转换为 int。如果它已经是一个 int 这就是一个空操作。如果它是一个列表,那么这会引发一个 TypeError。

try:
    return [int(x)]
except TypeError:
    return x

尽管如果异常情况发生的概率很高,则通常不赞成使用异常进行流量控制。这是因为处理异常是一项相当漫长的任务。

另一种方法是使用isinstance运算符。

if isinstance(x, list):
    return x
else:
    return [x]
于 2012-07-10T21:59:47.730 回答
2
listInt = intVal if isinstance(intVal,list) else [intVal]

如果 value 不是列表,这将始终返回一个列表。希望这可以帮助

于 2012-07-10T22:02:48.873 回答
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]

另外,也许您想要一个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.Sequencecollection.Iterable定义__subclasshook__了执行适当hasattr检查的s。

最后,冒着无聊的风险——如果你可以控制返回函数,尽可能只返回一个单项列表。

于 2012-07-11T01:48:48.030 回答