当前位置: 首页 > 面试题库 >

通过列表理解拼合列表

董飞
2023-03-14
问题内容

我正在尝试使用python中的列表理解来扁平化列表。我的清单有点像

[[1, 2, 3], [4, 5, 6], 7, 8]

只是为了打印,然后在此列表中的单个项目我写了这段代码

   def flat(listoflist):
     for item in listoflist:
             if type(item) != list:
                     print item
             else:
                     for num in item:
                             print num  
>>> flat(list1)
1
2
3
4
5
6
7
8

然后我使用相同的逻辑通过列表理解来整理列表,但出现以下错误

    list2 = [item if type(item) != list else num for num in item for item in list1]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable

如何使用列表理解来展平这种类型的列表?


问题答案:
>>> from collections import Iterable
>>> from itertools import chain

单线:

>>> list(chain.from_iterable(item if isinstance(item,Iterable) and
                    not isinstance(item, basestring) else [item] for item in lis))
[1, 2, 3, 4, 5, 6, 7, 8]

可读版本:

>>> def func(x):                                         #use `str` in py3.x 
...     if isinstance(x, Iterable) and not isinstance(x, basestring): 
...         return x
...     return [x]
... 
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
#works for strings as well
>>> lis = [[1, 2, 3], [4, 5, 6], 7, 8, "foobar"]
>>> list(chain.from_iterable(func(x) for x in lis))                                                                
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']

使用嵌套列表理解:(与相比要慢一些itertools.chain):

>>> [ele for item in (func(x) for x in lis) for ele in item]
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']


 类似资料:
  • 问题内容: 伙计们 我正在尝试找到问题的最优雅解决方案,并且想知道python是否为我想做的事情内置了任何东西。 我正在做的是这个。我有一个列表,并且我有一个接受项目并返回列表的函数。我可以使用列表推导来转换所有内容,例如: 但这返回一个列表列表; 我真正想要的是获取扁平化的列表; 现在,其他语言也有它。传统上用函数式编程语言来称呼它,而.Net称它为。python有类似的东西吗?有没有一种巧妙的

  • 问题内容: 一个合理的常见操作是基于另一个过滤。人们很快发现: 对于大输入而言,速度很慢-为O(n * m)。uck 我们如何加快速度?使用a进行过滤查找O(1): 这给出了很好的整体O(n)行为。但是,我经常看到甚至资深的编码人员也落入 The Trap ™: 阿克!这也是O(n * m),因为python 每次都 构建,而不仅仅是一次构建。 我以为故事就此结束了-python无法优化它,只能构

  • 我使用的是Windows10i7第四代笔记本电脑,内存为8GB。 我想找出从1到100000000的数字之和可以被5整除。 我正在尝试在Raku REPL中运行此代码: 代码运行了45分钟,仍然没有输出。我该如何克服呢? 在这种情况下,如何应用并发呢?我认为以上问题可以通过并发或任务并行来解决!!

  • 问题陈述:给你一个指针,指向在某个节点合并在一起的两个链表的头节点。找出这个合并发生的节点。这两个头节点将是不同的,并且都不会为空。 输入格式您必须完成int FindMergeNode(Node*head A, Node*head B)方法,该方法接受两个参数-链表的头。您不应该从标准输入/控制台读取任何输入。 输出格式查找两个列表合并的节点并返回该节点的数据。不要将任何内容打印到标准输出/控制

  • 问题内容: 我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。 我的代码如下所示: 但是后来我想,这样写会更好吗? 它更具可读性,并且如果需要性能,则可以取出以获得某些东西。 问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念,应该以另一种方式来做到这一点(例如,使用而不是)吗? 问题答案: 我发现列表理解比 清晰得多,但请使用任何你更容易理解

  • 问题内容: 我试图在一个内部列表中使用外部列表理解的值: 但是不幸的是,这会引发NameError,因为名称是未知的(尽管外部列表理解指定了该名称)。 这是Python的局限性(尝试过2.7.3和3.2.3)还是有充分的理由解释为什么它不起作用? 是否有计划摆脱限制? 是否有解决方法(可能我没有弄清楚一些不同的语法)来实现我想要的? 问题答案: 您在谈论列表 推导 ,而不是生成器表达式。 您需要交