【问题标题】:If else logic in python nested list comprehensionpython嵌套列表理解中的if else逻辑
【发布时间】:2017-04-26 19:46:55
【问题描述】:

我有一个列表,它可以由列表或整数或无组成。我想将此列表中的可迭代元素(假设现在只有列表)展平为单个元素。

例如:

[[0, 1], [2, 3], 1, 3, 4, 0, None] into [0,1,2,3,1,3,4,0,None] 

使用列表理解。我发现了另一个类似的问题,但所有这些元素在该列表中都是可迭代的,因为我的也有整数,我如何在第一个“for 循环”的列表理解中使用 if else 逻辑。我正在尝试这样的事情,但不确定确切的语法是什么。

[ item sublist if isinstance(sublist,list) else [sublist] for 子列表中的项目的子列表]

基于其他问题,if-else 应该出现在 for 循环之前,而 for 循环必须按顺序出现。我无法在第一个 for 循环之后插入 if else,语法只允许 if 而不是 else。

有人可以帮忙解释一下这个语法吗,在第一个 for 循环中执行 if-else 或在理解中嵌套 for 循环中的任何中间 for 循环?

【问题讨论】:

    标签: python python-2.7 list nested list-comprehension


    【解决方案1】:

    @mgilson 使用推导式给出了一个优雅的解决方案。也可以使用错误捕获在自然循环中这样做:

    items = [[0, 1], [2, 3], 1, 3, 4, 0, None]
    flattened = []
    for item in items:
        try:
            flattened.extend(item)
        except TypeError:
            flattened.append(item)
    
    print(flattened) #prints [0, 1, 2, 3, 1, 3, 4, 0, None]
    

    【讨论】:

      【解决方案2】:

      您可以使用生成器将混合列表转换为只有列表的可迭代对象:

      gen = (x if isinstance(x, collections.Iterable) else [x] for x in A)
      

      然后你可以使用标准的扁平化习惯来扁平化生成器:

      flattened = [y for x in gen for y in x]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多