4

我对python相当陌生,正在尝试弄清楚如何在列表中复制项目。我尝试了几种不同的方法并广泛搜索了答案,但总是想出如何删除重复项目的答案,我觉得我错过了一些应该相当明显的东西。

我想要一个要复制的项目列表,例如如果列表是 [1, 4, 7, 10] 是 [1, 1, 4, 4, 7, 7, 10, 10]

我知道

list = range(5)
for i in range(len(list)):
    list.insert(i+i, i)
print list

将返回 [0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 但如果项目不按顺序,这将不起作用。为了提供更多上下文,我将音频作为列表处理,试图让音频变慢。

我正在与:

def slower():
     left = Audio.getLeft()
     right = Audio.getRight()
     for i in range(len(left)):
          left.insert(????)
          right.insert(????)

其中“left”返回左耳机中“声音”的项目列表,“right”是右耳机中声音的项目列表。任何帮助,将不胜感激。谢谢。

4

5 回答 5

6

这是一个简单的方法:

def slower(audio):
    return [audio[i//2] for i in range(0,len(audio)*2)]
于 2013-10-15T23:33:43.723 回答
2

像这样的工作:

>>> list = [1, 32, -45, 12]
>>> for i in range(len(list)):
...     list.insert(2*i+1, list[2*i])
... 
>>> list
[1, 1, 32, 32, -45, -45, 12, 12]

几点注意事项:

  • 不要list用作变量名。
  • 将自身压缩的列表展平可能更干净。

例如

>>> zip(list,list)
[(1, 1), (-1, -1), (32, 32), (42, 42)]
>>> [x for y in zip(list, list) for x in y]
[1, 1, -1, -1, 32, 32, 42, 42]

或者,您可以用以下方式懒惰地做这件事itertools

from itertools import izip, chain
for item in chain.from_iterable(izip(list, list)):
    print item

我实际上最喜欢这种方法。当我查看代码时,我立即知道它在做什么(尽管其他人可能对此有不同的看法)。

我想当我在这里的时候,我会指出我们可以用生成器函数做和上面一样的事情:

def multiply_elements(iterable, ntimes=2):
    for item in iterable:
        for _ in xrange(ntimes):
            yield item

让我们面对现实吧——生成器非常有趣。:-)

于 2013-10-15T23:28:27.890 回答
0
listOld = [1,4,7,10]
listNew = []

for element in listOld:
    listNew.extend([element,element])
于 2013-10-15T23:31:35.213 回答
0

这可能不是最快的方式,但它非常紧凑

a = range(5)
list(reduce(operator.add, zip(a,a)))

a 然后包含

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4]
于 2013-10-15T23:31:52.140 回答
0
a = [0,1,2,3]
list(reduce(lambda x,y: x + y, zip(a,a))) #=> [0,0,1,1,2,2,3,3]
于 2013-10-15T23:37:39.047 回答