Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 如何创建列出非列表值的listcomp,然后使用itertools展平所有内容?_Python_Python 3.x - Fatal编程技术网

Python 如何创建列出非列表值的listcomp,然后使用itertools展平所有内容?

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):

我在这里问你关于标题中的问题,因为我对Python都是新手,尤其是创建listcomps

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

  • 检查
    *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]
    的输出。请在下面找到我的答案。你怎么认为?这是一个好的解决方案还是我应该意识到一些潜在的不需要的东西?这就是为什么解释你的实际问题很重要,而不仅仅是关于你尝试的解决方案的问题。看,谢谢,我现在会记住:)。