Answers:
我希望这对别人a,b,x,y
有帮助,因为对我没有太大的意义!假设您有一个充满句子的文本,并且想要一个单词数组。
# Without list comprehension
list_of_words = []
for sentence in text:
for word in sentence:
list_of_words.append(word)
return list_of_words
我喜欢将列表理解理解为水平扩展代码。
尝试将其分解为:
# List Comprehension
[word for sentence in text for word in sentence]
例:
>>> text = (("Hi", "Steve!"), ("What's", "up?"))
>>> [word for sentence in text for word in sentence]
['Hi', 'Steve!', "What's", 'up?']
这也适用于发电机
>>> text = (("Hi", "Steve!"), ("What's", "up?"))
>>> gen = (word for sentence in text for word in sentence)
>>> for word in gen: print(word)
Hi
Steve!
What's
up?
e,我想我找到了答案:我对那个循环是内部的,哪个循环是外部的,没有足够的小心。列表理解应为:
[x for b in a for x in b]
为了获得期望的结果,是的,一个当前值可以作为下一个循环的迭代器。
迭代器的顺序似乎违反直觉。
举个例子: [str(x) for i in range(3) for x in foo(i)]
让我们分解一下:
def foo(i):
return i, i + 0.5
[str(x)
for i in range(3)
for x in foo(i)
]
# is same as
for i in range(3):
for x in foo(i):
yield str(x)
[(output in loop 2) (loop 1) (loop 2)]
与(loop 1) = for i in range(3)
和(loop 2) = for x in foo(i):
和(output in loop 2) = str(x)
。
ThomasH已经添加了一个很好的答案,但是我想说明会发生什么:
>>> a = [[1, 2], [3, 4]]
>>> [x for x in b for b in a]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> [x for b in a for x in b]
[1, 2, 3, 4]
>>> [x for x in b for b in a]
[3, 3, 4, 4]
我猜想Python从左到右解析列表理解。这意味着,将首先for
执行发生的第一个循环。
第二个“问题”是b
从列表理解中“泄漏”出去。在第一次成功理解清单之后b == [3, 4]
。
x = 'hello';
[x for x in xrange(1,5)];
print x # x is now 4
这种记忆技术对我有很大帮助:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
现在,你可以想想[R E打开+ Ø uter环作为唯一的[R飞行Ø刻申
综上所述,即使对于3个循环,列表中的顺序也很容易:
c=[111, 222, 333]
b=[11, 22, 33]
a=[1, 2, 3]
print(
[
(i, j, k) # <RETURNED_VALUE>
for i in a for j in b for k in c # in order: loop1, loop2, loop3
if i < 2 and j < 20 and k < 200 # <OPTIONAL_IF>
]
)
[(1, 11, 111)]
因为上面只是一个:
for i in a: # outer loop1 GOES SECOND
for j in b: # inner loop2 GOES THIRD
for k in c: # inner loop3 GOES FOURTH
if i < 2 and j < 20 and k < 200:
print((i, j, k)) # returned value GOES FIRST
对于迭代一个嵌套列表/结构,技术是相同的:a
从问题出发:
a = [[1,2],[3,4]]
[i2 for i1 in a for i2 in i1]
which return [1, 2, 3, 4]
互相嵌套的水平
a = [[[1, 2], [3, 4]], [[5, 6], [7, 8, 9]], [[10]]]
[i3 for i1 in a for i2 in i1 for i3 in i2]
which return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
等等
这个flatten_nlevel函数递归调用嵌套的list1以隐蔽到一个级别。试试看
def flatten_nlevel(list1, flat_list):
for sublist in list1:
if isinstance(sublist, type(list)):
flatten_nlevel(sublist, flat_list)
else:
flat_list.append(sublist)
list1 = [1,[1,[2,3,[4,6]],4],5]
items = []
flatten_nlevel(list1,items)
print(items)
输出:
[1, 1, 2, 3, 4, 6, 4, 5]
flatten_nlevel(sublist, flat_list)
吧?!
[x for b in a for x in b]
这一直是关于python的错误。这种语法是如此倒退。常规形式的x for x in y
always总是在for之后直接包含变量,并馈给for左侧的表达式。一旦您进行了双重理解,您最近迭代的变量就会突然变得“远”。这是尴尬,不自然地在所有的读