【问题标题】:can anyone solve this by using list comprehension method like fizzBuzz problem任何人都可以通过使用像 fizzBu​​zz 问题这样的列表理解方法来解决这个问题
【发布时间】:2023-02-22 12:34:00
【问题描述】:
l=["Sai", "prasad", 1234,12.34, [1,2,3,4]]
def filter_int(l):
    l1=[]
    for i in l:
        if type(i)==int or type(i)==float:
            l1.append(i)
        elif type(i)==list:
            for j in i:
                l1.append(j)
    return l1
                
   
filter_int(l)

# i tried this 
l=["Sai", "prasad", 1234,12.34, [1,2,3,4]]
def filter_int(l):
    l1=[]
    [l1.append(i) if type(i)==int or type(i)==float else l1.append(i) if type(i)==list else i for i in l]
    return l1
filter_int(l)

我现有的输出是

[1234, 12.34, [1, 2, 3, 4]]

我的预期输出是

[1234, 12.34, 1, 2, 3, 4]

(..我想要上面列表理解的输出)

【问题讨论】:

  • 不要对副作用使用列表理解。列表理解的要点是收集列表中生成器表达式的所有值。通过对副作用使用列表理解,您创建了一个无用的列表。只使用常规的 for 循环更有效
  • 你在滥用列表理解for side effects。我认为您的预期输出在单个列表组合中实际上是不可能的,至少不是干净的。

标签: python fizzbuzz


【解决方案1】:

您强制初始数据中的每个元素都是一个列表(假设只有一层嵌套),然后使用 itertools.chain.from_iterable 将其展平,然后将其过滤掉

>>> data=["Sai", "prasad", 1234,12.34, [1,2,3,4]]
>>> import itertools
>>> [x for x in itertools.chain.from_iterable(y if isinstance(y,list) else [y] for y in data) if isinstance(x,(int,float))]
[1234, 12.34, 1, 2, 3, 4]

或者如果不允许导入:

>>> [x for z in [y if isinstance(y,list) else [y] for y in data] for x in z if isinstance(x,(int,float))]
[1234, 12.34, 1, 2, 3, 4]

【讨论】:

    【解决方案2】:

    在你的行

    [l1.append(i) if type(i)==int or type(i)==float else l1.append(i) if type(i)==list else i for i in l]
    

    你打电话给l1.append(i) if type(i) == list。这样一来,您就可以按原样附加列表。只需将其更改为extend(i)

    [l1.append(i) if type(i)==int or type(i)==float else l1.extend(i) if type(i)==list else i for i in l]
    
    #output
    [1234, 12.34, 1, 2, 3, 4]
    

    正如@PranavHosangadi 和@CrazyChucky 所指出的,您不应该为此使用列表理解,而应该使用循环。但是,在需要以这种方式使用列表理解的约束下,这应该可以解决您的问题。

    【讨论】:

      【解决方案3】:

      你可以使用list.extend

      def filter_int(l):
          l1=[]
          [l1.append(i) if type(i)==int or type(i)==float else l1.extend(i) if type(i)==list else i for i in l]
          return l1
      

      如果列表的深度未知,您可以使用这样的递归解决方案

      def filter_int(l):
          l1=[]
          [l1.append(i) if type(i)==int or type(i)==float else l1.extend(filter_int(i)) if type(i)==list else i for i in l]
          return l1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        相关资源
        最近更新 更多