让我们假设 我有一个元组列表,如:
lot = [ (a,b),(c,d) ]
我希望将其转换为以下列表:
[a,b,c,d]
浏览stackoverflow后,我发现以下代码可以完成我想要做的事情:
mylist = [y for x in lot for y in x ]
问题:
1)如果我取出for y in x
部分,代码怎么会中断?我想我的问题是如何解释列表理解中的条款
2)这是将元组列表转换为列表的正确pythonic方法吗?
答案 0 :(得分:1)
如果您移除了部分for y in x
,那么在左边的内容中:y for x in lot
- y
未定义!
是的,使用列表理解被认为非常“pythonic”#39; :)
答案 1 :(得分:1)
2,是的。但也许你喜欢这个list(chain(*lot))
,我觉得它更好,尽管不是那么pythonic。
因为不需要x和y作为临时变量,而且更加紧凑。
答案 2 :(得分:1)
阅读理解的一种更简单的方法是在没有理解的情况下思考解决方案。你会这样做:
>>> lot = [ ('a','b'),('c','d') ]
>>> result = []
>>> for a_tuple in lot:
... for item in a_tuple:
... result.append(item)
...
>>> result
['a', 'b', 'c', 'd']
如果列表推导涉及两个循环,您只需编写循环的顺序,就像上面的“非列表理解”解决方案一样,但都在一行中:
>>> result = [item for a_tuple in lot for item in a_tuple]
>>> result
['a', 'b', 'c', 'd']
这应该回答为什么如果你取消第二个循环代码中断的原因。是的,使用列表推导被认为是“pythonic”。
答案 3 :(得分:1)
嵌套列表推导从左到右循环:
mylist = [y for x in lot for y in x ]
^^^^^^^^^^^^ this iterates through lot
e.g. x = ('a','b'), then x = ('c','d')
mylist = [y for x in lot for y in x ]
^^^^^^^^^^ this iterates through each element in the tuple x
since x = ('a', 'b'), y = 'a', then y = 'b', etc
mylist = [y for x in lot for y in x ]
^ this is the output
所以在上面的例子中:
x | y | output
--------|---|--------
(a, b) | a | a
(a, b) | b | b
(c, d) | c | c
(c, d) | d | d