我想知道是否有一条快捷方式可以在Python列表中列出一个简单的列表.
我可以在for循环中做到这一点,但也许有一些很酷的"单行"?我用reduce尝试了,但是我收到了一个错误.
码
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Run Code Online (Sandbox Code Playgroud)
错误信息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud) 如何在Python中执行以下操作?
row = [unicode(x.strip()) for x in row if x is not None else '']
Run Code Online (Sandbox Code Playgroud)
实质上:
很简单,什么是尾部调用优化?更具体地说,任何人都可以显示一些可以应用的小代码片段,而不是在哪里,并解释为什么?
language-agnostic algorithm recursion tail-recursion tail-call-optimization
是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?
我尝试使用嵌套列表理解来压缩这样的列表,如下所示:
[image for image in menuitem for menuitem in list_of_menuitems]
Run Code Online (Sandbox Code Playgroud)
但我在NameError
那里遇到麻烦,因为name 'menuitem' is not defined
.谷歌搜索并浏览Stack Overflow后,我得到了一个reduce
声明所需的结果:
reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
但是这个方法相当难以理解,因为我需要那个list(x)
调用,因为x是一个Django QuerySet
对象.
结论:
感谢所有为此问题做出贡献的人.以下是我学到的内容摘要.我也将其作为社区维基,以防其他人想要添加或更正这些观察结果.
我原来的reduce语句是多余的,用这种方式编写得更好:
>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
这是嵌套列表理解的正确语法(Brilliant summary dF!):
>>> [image for mi in list_of_menuitems for image in mi]
Run Code Online (Sandbox Code Playgroud)
但这些方法都不如使用效率高itertools.chain
:
>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)
正如@cdleary指出的那样,通过使用chain.from_iterable
如下所示来避免*操作符魔术可能是更好的风格:
>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, …
Run Code Online (Sandbox Code Playgroud) 我有一个布尔类型的NumPy数组'boolarr'.我想计算其值为的元素数量True
.是否有专门用于此任务的NumPy或Python例程?或者,我是否需要迭代脚本中的元素?
for k, v in d.iteritems():
if type(v) is dict:
for t, c in v.iteritems():
print "{0} : {1}".format(t, c)
Run Code Online (Sandbox Code Playgroud)
我正在尝试遍历字典并打印出值不是嵌套字典的所有键值对.如果值是字典,我想进入它并打印出其键值对...等.有帮助吗?
编辑
这个怎么样?它仍然只打印一件事.
def printDict(d):
for k, v in d.iteritems():
if type(v) is dict:
printDict(v)
else:
print "{0} : {1}".format(k, v)
Run Code Online (Sandbox Code Playgroud)
完整测试案例
字典:
{u'xml': {u'config': {u'portstatus': {u'status': u'good'}, u'target': u'1'},
u'port': u'11'}}
Run Code Online (Sandbox Code Playgroud)
结果:
xml : {u'config': {u'portstatus': {u'status': u'good'}, u'target': u'1'}, u'port': u'11'}
Run Code Online (Sandbox Code Playgroud) 家伙.我正试图找到一个问题最优雅的解决方案,并想知道python是否内置了我正在尝试做的事情.
我正在做的是这个.我有一个列表,A
我有一个函数f
,它接受一个项目并返回一个列表.我可以使用列表理解来转换所有内容A
;
[f(a) for a in A]
Run Code Online (Sandbox Code Playgroud)
但这会返回列表清单;
[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]
Run Code Online (Sandbox Code Playgroud)
我真正想要的是得到扁平化的清单;
[b11,b12,b21,b22,b31,b32]
Run Code Online (Sandbox Code Playgroud)
现在,其他语言都有它; 它传统上称为flatmap
函数式编程语言,而.Net称之为SelectMany
.python有类似的东西吗?有没有一种巧妙的方法来映射列表上的函数并使结果变平?
我试图解决的实际问题是这个; 从目录列表开始,找到所有子目录.所以;
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs
Run Code Online (Sandbox Code Playgroud)
currentliy给了我一个列表列表,但我真的想要一个列表.
使用Sqlite,"select..from"命令返回结果"output",其打印(在python中):
>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
Run Code Online (Sandbox Code Playgroud)
它似乎是一个元组列表.我想在一个简单的1D数组中转换"输出"(我猜的是Python中的列表):
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
Run Code Online (Sandbox Code Playgroud)
或2x3矩阵:
12.2817 12.2817
0 0
8.52 8.52
Run Code Online (Sandbox Code Playgroud)
通过"output [i] [j]"读取
flatten命令不能完成第一个选项的工作,我不知道第二个选项...... :)
你能给我一个提示吗?有些事情很快就会很好,因为真正的数据要大得多(这里只是一个简单的例子).
编辑:问题不是如何做到 - 这已经在其他问题中讨论过 - 问题是,这是最快的方法?
我之前找到了解决方案,但我想知道最快的解决方案是什么来压缩包含其他任意长度列表的列表.
例如:
[1, 2, [3, 4, [5],[]], [6]]
Run Code Online (Sandbox Code Playgroud)
会成为:
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
可以有无限多个级别.某些列表对象可以是字符串,不能将其展平为输出列表中的连续字符.
我想遍历列表列表.
我想迭代列表中的不规则嵌套列表.
任何人都可以让我知道我该怎么做?
x = [u'sam', [['Test', [['one', [], []]], [(u'file.txt', ['id', 1, 0])]], ['Test2', [], [(u'file2.txt', ['id', 1, 2])]]], []]
Run Code Online (Sandbox Code Playgroud)