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(????)

ここで、「左」は左のヘッドフォンの「サウンド」であるアイテムのリストを返し、「右」は右のヘッドフォンのサウンドであるアイテムのリストを返します。どんな助けでも大歓迎です。ありがとう。

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)))

を含む

[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 に答える