list.extend和list comprehension

Sta*_*tas 26 python list-comprehension list

当我需要在列表中添加几个相同的项目时,我使用list.extend:

a = ['a', 'b', 'c']
a.extend(['d']*3)
Run Code Online (Sandbox Code Playgroud)

结果

['a', 'b', 'c', 'd', 'd', 'd']
Run Code Online (Sandbox Code Playgroud)

但是,如何与列表理解类似?

a = [['a',2], ['b',2], ['c',1]]
[[x[0]]*x[1] for x in a]
Run Code Online (Sandbox Code Playgroud)

结果

[['a', 'a'], ['b', 'b'], ['c']]
Run Code Online (Sandbox Code Playgroud)

但我需要这个

['a', 'a', 'b', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ign*_*ams 35

堆叠式LC.

[y for x in a for y in [x[0]] * x[1]]
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!它有效,但我甚至不懂如何阅读这个表达式. (9认同)
  • 解包时通常更清楚:[y为(项目,时间)在[项目]*中的y中] (9认同)
  • @tokland:+1这就是我所做的.但是我会避免使用`times`因为它看起来太像'items`的错字了.例如,使用`repeat`代替. (3认同)
  • `for x in a` 一次将 `a` 的每个元素提取到 `x` 中。`for y in ...` 从 `x` 创建一个新列表,并一次提取一个元素到 `y` 中。这一切都同时发生(或多或少),导致它们都处于同一嵌套级别。 (2认同)

sdc*_*vvc 5

>>> a = [['a',2], ['b',2], ['c',1]]
>>> [i for i, n in a for k in range(n)]
['a', 'a', 'b', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)


tok*_*and 5

一个itertools方法:

import itertools

def flatten(it):
    return itertools.chain.from_iterable(it)

pairs = [['a',2], ['b',2], ['c',1]]
flatten(itertools.repeat(item, times) for (item, times) in pairs)
# ['a', 'a', 'b', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)


dhe*_*aur 5

如果您更喜欢扩展而不是列表理解:

a = []
for x, y in l:
    a.extend([x]*y)
Run Code Online (Sandbox Code Playgroud)

  • 我认为他问的是如何从列表理解的*内进行扩展,但我认为如果不关心性能的话,像这样的简单循环更具可读性。 (4认同)