如何创建一个用于列出非列表值的listcomp,然后使用itertools压平所有内容



我在这里向您询问标题中的问题,因为我对Python都是新手,尤其是创建listcomps。

我想创建一个简单的函数:

  1. 检查*args中的所有参数是否为列表
  2. 如果否,则将值更改为列表
  3. 使用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](正确(。

我的问题是如何从这个部分创建一个列表组件:

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]

我犯了什么错?

您想要的listcomp是:

lstargs = [x if isinstance(x, list) else [x] for x in lstargs]

以再现整个CCD_ 5。你的尝试只是过滤掉了list,它没有在包装和非包装之间做出选择,而是两者都产生了。您不需要将args预先转换为list即可清楚,因此可以将函数简化为:

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纯可迭代(我猜是元组(。

最新更新