Python 如何创建列出非列表值的listcomp,然后使用itertools展平所有内容?
我在这里问你关于标题中的问题,因为我对Python都是新手,尤其是创建listcomps 我想创建一个简单的函数来:Python 如何创建列出非列表值的listcomp,然后使用itertools展平所有内容?,python,python-3.x,Python,Python 3.x,我在这里问你关于标题中的问题,因为我对Python都是新手,尤其是创建listcomps 我想创建一个简单的函数来: 检查*args中的所有arg是否都是列表 如果否,则将值更改为列表 使用itertools 您可以在下面找到我的代码: import itertools def lstfunc(*args): lstargs = list(args) for i in lstargs: if not isinstance(i, list):
*args
中的所有arg是否都是列表itertools
import itertools
def lstfunc(*args):
lstargs = list(args)
for i in lstargs:
if not isinstance(i, list):
lstargs[lstargs.index(i)] = [i]
lstargs = list(itertools.chain.from_iterable(lstargs))
return lstargs
print(lstfunc([1, 2, 3], 4, 5))
输出:[1,2,3,4,5]
(正确)
我的问题是如何从该部分创建listcomp:
for i in lstargs:
if not isinstance(i, list):
lstargs[lstargs.index(i)] = [i]
我试过:
import itertools
def lstfunc(*args):
lstargs = list(args)
lstargs = [[i] for i in lstargs if not isinstance(i, list)]
lstargs = list(itertools.chain.from_iterable(lstargs))
return lstargs
print(lstfunc([1, 2, 3], 4, 5))
但遗憾的是,这只不过是[4,5]
我错在哪里?您想要的列表是:
lstargs = [x if isinstance(x, list) else [x] for x in lstargs]
要复制整个列表
。您的尝试只是过滤掉了列表
s,它没有在包装和非包装之间进行选择,并且两者都产生了。无需将args
预转换为列表
即可清除,因此可以将函数简化为:
def lstfunc(*args):
# Save eager conversion to temp list by using genexpr instead of listcomp
lstargs = (x if isinstance(x, list) else [x] for x in args) #
return list(itertools.chain.from_iterable(lstargs))
在经历了很多痛苦之后,我找到了最简单、最有吸引力的解决办法(我想)!我需要上面的函数来创建一个1D列表,以便将其传递给另一个函数。然而,这是没有必要的。我只需要一个拆包操作员:
def testfunc(*args):
print(args)
testfunc(*[1, 2, 3], 4)
输出:(1,2,3,4)
此解决方案自动将所有值展平为1D纯iterable(我猜是元组)。@Konrad:不客气。提示:对于完全通用的代码,您最好从
集合导入Iterable
ABC。ABC
并将isinstance(x,list)
更改为isinstance(x,Iterable)
(可能isinstance(x,Iterable)而不是isinstance(x,(str,ByteString))
如果str
/字节
/字节
/字节数组
参数是需要的,尽管这相当详细),那么您就不会在列表
中包装元组
、集合
、随机迭代器等内容。如果有人调用lstfunc((2,3,5),range(3),(x**2代表[10,11,12])
您可能需要[2,3,5,0,1,2100,121,144]
的输出。请在下面找到我的答案。你怎么认为?这是一个好的解决方案还是我应该意识到一些潜在的不需要的东西?这就是为什么解释你的实际问题很重要,而不仅仅是关于你尝试的解决方案的问题。看,谢谢,我现在会记住:)。