![]() |
1
331
使用生成器函数可以使您的示例更容易阅读,并可能提高性能。 Python 2
我用了 Iterable ABC 加入2.6。 Python 3
在python 3中,
这个
|
![]() |
2
46
我的解决方案:
稍微简洁一点,但基本相同。 |
![]() |
3
33
@unutbu的非递归解决方案的生成器版本,如@andrew在注释中要求的那样:
此生成器的简化版本:
|
![]() |
4
32
使用递归和duck类型的生成器(更新为python 3):
|
![]() |
5
25
本版本
下面是一些示例,演示它的用法:
虽然
|
![]() |
6
21
这里是我的递归flatten函数版本,它处理元组和列表,并允许您抛出任何位置参数组合。返回按顺序生成整个序列的生成器,arg by arg:
用途:
|
![]() |
7
13
这是另一个更有趣的答案…
基本上,它将嵌套列表转换为字符串,使用regex除去嵌套语法,然后将结果转换回(扁平的)列表。 |
![]() |
8
10
|
![]() |
9
7
你可以使用
它是一个迭代器,因此您需要迭代它(例如,用
我是
|
![]() |
10
6
尝试创建一个可以在python中平展不规则列表的函数是很有趣的,当然这就是python的目的(使编程变得有趣)。以下发电机工作正常,但有一些注意事项:
它将扁平化您可能希望单独使用的数据类型(如
编辑: 我不同意以前的实现。问题是,你不应该压扁那些不可迭代的东西。这很混乱,给人的印象是错误的。
下面的生成器几乎与第一个生成器相同,但不存在试图展平不可迭代对象的问题。当给它一个不适当的论据时,它会如人们所期望的那样失败。
使用提供的列表测试发电机工作正常。但是,新代码将引发
|
![]() |
11
4
我喜欢简单的答案。没有发电机。没有递归或递归限制。只是迭代:
这适用于两个列表:内部for循环和外部while循环。 内部for循环遍历列表。如果它找到一个list元素,它(1)使用list.extend()将该部分扁平化一级嵌套,(2)将keepchecking切换为true。keepchecking用于控制外部while循环。如果外部循环设置为true,则会触发内部循环以进行另一次传递。 这些过程会一直发生,直到找不到更多的嵌套列表。当一个过程最终在没有找到的地方发生时,keepchecking永远不会被触发为true,这意味着listinsested保持为false,而outer则退出循环。 然后返回扁平列表。 试运行
|
![]() |
12
4
虽然我们选择了一个优雅的、非常有感染力的答案,但我还是会提出我的解决方案供大家参考:
请说明此代码有多好或有多坏? |
![]() |
13
4
下面是一个简单的函数,它可以扁平任意深度的列表。没有递归,以避免堆栈溢出。
|
![]() |
14
2
这里是
有更好、更快的方法(如果你已经到达这里,你已经看到了) 还要注意:
|
![]() |
15
2
我很惊讶没人想到这一点。该死的递归,我不知道这里的高级人员给出的递归答案。不管怎样,这是我的尝试。需要注意的是,它非常特定于OP的用例
输出:
|
![]() |
16
2
我并没有把所有已经有的答案都写在这里,但这里有一个我想出的一行程序,借用了Lisp的第一和剩余列表处理方法。
这里有一个简单的和一个不那么简单的例子-
|
![]() |
17
1
完全是黑客,但我认为它会起作用(取决于你的数据类型)
|
![]() |
18
1
这是另一个PY2方法,我不确定它是最快的,还是最优雅的,还是最安全的…
它可以忽略您想要的任何特定(或派生)类型,它返回一个迭代器,因此您可以将它转换为任何特定的容器,如list、tuple、dict或简单地使用它来减少内存占用,无论是好是坏,它都可以处理初始的不可重复对象,如int… 注意,大部分繁重的工作都是在C中完成的,因为据我所知,ITertools是如何实现的,所以虽然它是递归的,但是afaik它不受python递归深度的限制,因为函数调用是在C中进行的,尽管这并不意味着您受到内存的限制,特别是在OS X中,到今天为止它的堆栈大小有一个硬限制(OSX小牛队…… 有一个稍微快一点的方法,但是不太可移植的方法,只有当你可以假设输入的基本元素可以显式地确定,否则,你将得到一个无限的递归,并且OSX的堆栈大小有限,会很快抛出一个分段错误…
这里我们使用集合来检查类型,因此需要O(1)和O(类型数)来检查元素是否应该被忽略,尽管具有所述被忽略类型的派生类型的任何值都将失败,这就是为什么它使用
测验:
|
![]() |
19
1
使用
或者没有链子:
|
![]() |
20
1
我用递归法求解 任何深度的嵌套列表
所以在我定义了函数组合列表之后,很容易使用这个函数来做扁平化。或者你可以把它组合成一个函数。我喜欢我的解决方案,因为它可以应用于任何嵌套列表。
结果
|
![]() |
21
1
最简单的方法是使用
morph
图书馆利用
代码是:
|
![]() |
22
1
我知道已经有很多很棒的答案,但我想添加一个使用函数编程方法来解决问题的答案。在这个答案中,我使用了双递归:
输出:
|
![]() |
23
1
我不确定这是否需要更快或更有效,但这是我要做的:
这个
但是,如果你知道你的列表中会有方括号,比如
|
![]() |
24
0
如果您喜欢递归,这可能是您感兴趣的解决方案:
实际上,我改编了一些之前编写的实践方案代码。 享受! |
![]() |
25
0
我对python不熟悉,来自Lisp背景。这就是我想到的(查看lulz的var名称):
似乎起作用了。测试:
返回:
|
![]() |
26
0
我在这里没有看到像这样的东西,只是从一个关于同一主题的封闭式问题中得到的,但是为什么不做这样的事情(如果你知道你想要分割的列表的类型):
你需要知道元素的类型,但我认为这可以概括,就速度而言,我认为它会更快。 |
![]() |
27
0
不使用任何库:
|
![]() |
28
0
不知羞耻地从我自己的回答中 another question . 这个函数
代码如下:
|
![]() |
29
0
我们还可以使用python的“type”函数。在迭代列表时,我们检查该项是否是列表。如果没有,我们就“附加”它,否则我们就“扩展”它。这是一个示例代码-
输出:
有关append()和extend()的详细信息,请访问以下网站: https://docs.python.org/2/tutorial/datastructures.html |
![]() |
30
0
这可能是个老问题,我想试试看。 我是个哑巴,所以我会给出一个“哑巴”的解决方案。所有的递归都会伤害我的大脑。
我知道它在使用副作用,但我对递归的理解是这样的 |
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
shekharsabale · 从列表元素捕获子字符串 2 年前 |
![]() |
The Great · 拆分并存储数据帧,但名称基于特定列中的唯一值 2 年前 |
![]() |
Klimt865 · Python中的列表列表 2 年前 |
![]() |
Klimt865 · 在Python中将数组列表转换为列表列表 2 年前 |