Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从返回单个项或另一个列表的函数创建列表_Python_List - Fatal编程技术网

Python:从返回单个项或另一个列表的函数创建列表

Python:从返回单个项或另一个列表的函数创建列表,python,list,Python,List,(Python 3.5) 问题陈述:给定一个返回项或项列表的函数,是否有一条单行语句可以根据调用上述函数的结果初始化新列表 详细信息:我查看了python列表上的文档,并在repl上尝试了一些东西,但我似乎无法理解这一点 我正在调用读取xml文档的第三方函数。函数有时返回列表,有时返回单个项(取决于存在多少xml条目) 出于我的目的,我总是需要一个可以迭代的列表,即使它的长度是1。下面的代码正确地实现了我的愿望。然而,考虑到Python的优雅,它看起来很笨重。我怀疑有一种单一的方法可以做到这一点

(Python 3.5)

问题陈述:给定一个返回项或项列表的函数,是否有一条单行语句可以根据调用上述函数的结果初始化新列表

详细信息:我查看了python列表上的文档,并在repl上尝试了一些东西,但我似乎无法理解这一点

我正在调用读取xml文档的第三方函数。函数有时返回列表,有时返回单个项(取决于存在多少xml条目)

出于我的目的,我总是需要一个可以迭代的列表,即使它的长度是1。下面的代码正确地实现了我的愿望。然而,考虑到Python的优雅,它看起来很笨重。我怀疑有一种单一的方法可以做到这一点

def force_list(item_or_list):
    """
    Returns a list from either an item or a list.
    :param item_or_list: Either a single object, or a list of objects
    :return: A list of objects, potentially with a length of 1.
    """
    if item_or_list is None: return None
    _new_list = []
    if isinstance(item_or_list, list):
        _new_list.extend(item_or_list)
    else:
        _new_list.append(item_or_list)
    return _new_list
提前感谢,,
SteveJ

如果您正在寻找关于列出函数调用结果的一行代码:

假设有一个名为
func
的函数,它返回项目或项目列表:

elem = func()
answer = elem if isinstance(elem, list) else [elem]

这就是说,您应该真正重构
func
以返回一种类型的东西——让它返回一个包含许多元素的列表,或者在它只返回一个元素的情况下,让它返回一个包含该元素的列表。因此,您可以避免此类类型检查

您可以在一行中检查它,如下所示:

 if item: # Check whether it is not None or empty list
     # Check if it is list. If not, append it to existing list after converting it to list
     _new_list.extend(item if isiinstance(item, list) else [item])

在单行中执行此操作的另一种方法是

def force_list(item_or_list=[]):
    return item_or_list if type(item_or_list) is list else [item_or_list]
打印强制列表(“测试”)

试验

打印强制列表([“测试”、“测试2”])

[“测试”、“测试2”]


[item]如果不是isiinstance(item,list)else item
@inspectorG4dget您应该将其添加为答案;)您能指定什么是单一项目类型吗?它是一个字符串,还是一个整数,等等…@inspectorG4dget太快了!谢谢这个问题值得让其他人看到吗?或者我应该删除它吗?我想是的,这是一段漂亮的代码。你可能想要
[item]
-
列表(1)
不会生成列表:-)@mgilson:是的。更新了:)如果您想对任何iterable执行此操作,可以使用
导入集合;isinstance(elem,collections.Iterable)
取而代之。由于最后一段的原因,我将投票支持这一点——函数应该只返回单一类型的对象(并且可能
,但即使是在大多数情况下我更愿意避免的对象)。再次感谢。函数调用是对第三方库的调用。我的函数是一个包装器——它只返回列表或不返回任何列表……顺便说一句,你不应该去掉上面语句中的“not”吗?