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