相关疑难解决方法(0)

列表理解与地图

是否有理由更喜欢使用map()超过列表理解,反之亦然?它们中的任何一个通常比另一个更有效或被认为是更加pythonic?

python list-comprehension map-function

680
推荐指数
8
解决办法
19万
查看次数

在Python中展平浅层列表

是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?

我尝试使用嵌套列表理解来压缩这样的列表,如下所示:

[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)

python list-comprehension

382
推荐指数
10
解决办法
17万
查看次数

列表理解中的双重迭代

在Python中,您可以在列表推导中使用多个迭代器,例如

[(x,y) for x in a for y in b]
Run Code Online (Sandbox Code Playgroud)

对于一些合适的序列a和b.我知道Python列表推导的嵌套循环语义.

我的问题是:理解中的一个迭代器可以指向另一个吗?换句话说:我可以这样:

[x for x in a for a in b]
Run Code Online (Sandbox Code Playgroud)

外循环的当前值是内部的迭代器?

例如,如果我有一个嵌套列表:

a=[[1,2],[3,4]]
Run Code Online (Sandbox Code Playgroud)

列表理解表达式将实现此结果:

[1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

?? (请仅列出理解答案,因为这是我想要找到的).

python list-comprehension

202
推荐指数
9
解决办法
14万
查看次数

使用列表理解嵌套循环

如果我有两个字符串,'abc'并且'def',我可以使用两个for循环获得它们的所有组合:

for j in s1:
  for k in s2:
    print(j, k)
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够使用列表理解来做到这一点.我尝试了很多方法,但从未设法得到它.有谁知道如何做到这一点?

python for-loop list-comprehension

75
推荐指数
2
解决办法
5万
查看次数

了解嵌套列表理解

我想了解嵌套列表理解.下面,我列出了一个列表推导表达式和它们的for循环等价物.
我想知道我的理解是否正确.

例如,

[(min([row[i] for row in rows]),max([row[i] for row in rows])) 
for i in range(len(rows[0]))]
Run Code Online (Sandbox Code Playgroud)

相当于

result=[]
for i in range(len(rows[0])):
  innerResult=[]
  for row in rows:
    innerResult.append(row[i])
  innerResult2=[]
  for row in rows:
    innerResult2.append(row[i])
  tuple=(min(innerResult), max(innerResult2))
  result.append(tuple)
Run Code Online (Sandbox Code Playgroud)

如果我可以概括,我想

[exp2([exp1 for x in xSet]) for y in ySet]
Run Code Online (Sandbox Code Playgroud)

表格可以翻译成以下内容.(我希望我对此是正确的)

result=[]
for y in ySet:
  innerResult =[]
  for x in xSet:
    innerResult.append(exp1)
  exp2Result = exp2(innerResult)
  result.append(exp2Result)
Run Code Online (Sandbox Code Playgroud)

对于更简单的情况,

[exp1 for x in xSet for y in ySet] 
Run Code Online (Sandbox Code Playgroud)

等于

result=[] 
for x in xSet: …
Run Code Online (Sandbox Code Playgroud)

python nested list-comprehension

72
推荐指数
2
解决办法
7万
查看次数

python list comprehensions; 压缩列表列表?

家伙.我正试图找到一个问题最优雅的解决方案,并想知道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给了我一个列表列表,但我真的想要一个列表.

python functional-programming list-comprehension

67
推荐指数
9
解决办法
5万
查看次数

"列表理解"是什么意思?它是如何工作的,我该如何使用它?

我有以下代码:

[x ** 2 for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

当我在Python Shell中运行它时,它返回:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Run Code Online (Sandbox Code Playgroud)

我搜索过,似乎这被称为列表理解,但它是如何工作的?

python list-comprehension list

46
推荐指数
4
解决办法
4792
查看次数

高级嵌套列表理解语法

我正在玩列表推导以更好地理解它们,我遇到了一些我无法解释的意外输出.我之前没有找到这个问题,但如果是/是/重复的问题,我道歉.

我本质上是在尝试编写一个生成生成器的生成器.使用列表推导的简单生成器如下所示:

(x for x in range(10) if x%2==0) # generates all even integers in range(10)
Run Code Online (Sandbox Code Playgroud)

我试图做的是编写一个生成两个生成器的生成器 - 第一个生成范围(10)中的偶数,第二个生成范围(10)中的奇数.为此,我做了:

>>> (x for x in range(10) if x%2==i for i in range(2))
<generator object <genexpr> at 0x7f6b90948f00>

>>> for i in g.next(): print i
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
>>> g.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in …
Run Code Online (Sandbox Code Playgroud)

python syntax scope list-comprehension

42
推荐指数
4
解决办法
5万
查看次数

使用Python中的List Comprehension映射嵌套列表?

我有以下代码用于在Python中映射嵌套列表以生成具有相同结构的列表.

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]
Run Code Online (Sandbox Code Playgroud)

这可以单独使用列表理解(不使用map函数)吗?

python list-comprehension list nested-lists map-function

9
推荐指数
2
解决办法
9465
查看次数

os.walk嵌套列表理解

试图枚举某个目录中的所有文件(如Linux中的"find."或Windows中的"dir/s/b").

我想出了以下嵌套列表理解:

from os import walk
from os.path import join
root = r'c:\windows'      #choose any folder here
allfiles = [join(root,f) for f in files for root,dirs,files in walk(root)]
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于最后一个表达式,我得到:

NameError: name 'files' is not defined

与此问题相关,哪个(虽然有效)我无法理解嵌套列表理解的语法.

python list-comprehension

8
推荐指数
2
解决办法
3829
查看次数