4 回答
![?](http://img1.sycdn.imooc.com/533e4c1500010baf02200220-100-100.jpg)
TA贡献2065条经验 获得超14个赞
列表理解为创建列表提供了一种简洁的方法。常见的应用程序是创建新的列表,其中每个元素是应用于另一个序列或可迭代的每个成员的某些操作的结果,或者创建满足特定条件的元素的子序列。
>>> l = [] >>> for x in range(10):... l.append(x**2)>>> l[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
map()
lambda
:
>>> list(map(lambda x: x**2, range(10)))[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x**2 for x in range(10)][0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
x
x**2
x
:
>>> [x.strip() for x in ('foo\n', 'bar\n', 'baz\n')]['foo', 'bar', 'baz']
x
>>> [int(x) for x in ('1', '2', '3')][1, 2, 3]
x
dict
>>> d = {'foo': '10', 'bar': '20', 'baz': '30'}>>> [d[x] for x in ['foo', 'baz']]['10', '30']
>>> d = {'foo': '10', 'bar': '20', 'baz': '30'}>>> [int(d[x].rstrip('0')) for x in ['foo', 'baz']][1, 3]
if
if...else
range(10)
>>> l = []>>> for x in range(10):... if x%2:... l.append(x)>>> l[1, 3, 5, 7, 9]
>>> [x for x in range(10) if x%2][1, 3, 5, 7, 9]
if...else
if ... else ...
x
, 不range(10)
:
>>> [i if i%2 != 0 else None for i in range(10)][None, 1, None, 3, None, 5, None, 7, None, 9]
for
>>> [i for x in [[1, 2, 3], [4, 5, 6]] for i in x][1, 2, 3, 4, 5, 6]>>> [j for x in [[[1, 2], [3]], [[4, 5], [6]]] for i in x for j in i] [1, 2, 3, 4, 5, 6]
for x in [[1, 2, 3], [4, 5, 6]]
[1, 2, 3]
[4, 5, 6]
for i in x
1
, 2
, 3
4
, 5
, 6
.
警告:for x in [[1, 2, 3], [4, 5, 6]]
以前 for i in x
:
>>> [j for j in x for x in [[1, 2, 3], [4, 5, 6]]]Traceback (most recent call last): File "<input>", line 1, in <module>NameError: name 'x' is not defined
集合理解
>>> {x for x in [1, 1, 2, 3, 3, 1]}{1, 2, 3}
>>> set([i for i in [1, 1, 2, 3, 3, 1]]){1, 2, 3}
A DECT理解 看上去{key: value for key, value in ...}
{i: i for i in ...}
{i for i in ...}
.
>>> {i: i**2 for i in range(5)}{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> d = {}>>> for i in range(5):... d[i] = i**2>>> d{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
(i for i in range(5))
>>> (i for i in range(5))<generator object <genexpr> at 0x7f52703fbca8>
>>> def gen():... for i in range(5):... yield i>>> gen()<generator object gen at 0x7f5270380db0>
>>> gen = (i for i in range(5))>>> next(gen)0>>> next(gen)1>>> list(gen)[2, 3, 4]>>> next(gen)Traceback (most recent call last): File "<input>", line 1, in <module>StopIteration
注:[]
sum()
:
>>> sum(i**2 for i in range(5))30
相关
![?](http://img1.sycdn.imooc.com/54584ed2000152a202200220-100-100.jpg)
TA贡献1869条经验 获得超4个赞
[<output expr> <loop expr <input expr>> <optional predicate expr>]
map()
filter()
![?](http://img1.sycdn.imooc.com/5333a1920001d36402200220-100-100.jpg)
TA贡献1946条经验 获得超4个赞
如果你更喜欢用一种更直观的方式来了解正在发生的事情,那么也许这会有所帮助:
# for the example in the question...
y = []
for x in range(10):
y += [x**2]
# is equivalent to...
y = [x**2 for x in range(10)]
# for a slightly more complex example, it is useful
# to visualize where the various x's end up...
a = [1,2,3,4]
b = [3,4,5,6]
c = []
for x in a:
if x in b:
c += [x]
# \ \ /
# \ _____\______/
# \ / \
# \/ \
# /\ \
# / \ \
# / \ \
c = [x for x in a if x in b]
print(c)
.产生输出[3, 4]
![?](http://img1.sycdn.imooc.com/54585094000184e602200220-100-100.jpg)
TA贡献1854条经验 获得超8个赞
语法
设置建造者符号速成课程
[1,2,3,4,...]
).
混淆点
1) Set Builder表示法中的谓词筛选器只指定要保留哪些项,而列表理解谓词则做同样的事情。
2) Set Builder表示法中的谓词过滤器位于末尾,在列表理解中也是如此。[x < 5 for x in range(10)]
[0,1,2,3,4]
[True, True, True, True, True, False, False, False, False, False]
[True, True, True, True, True, False, False, False, False, False]
x < 5
range(10)
如果在使用列表理解的同时在脑海中保留SET构建符号,那么它们就更容易接受了。
添加回答
举报