2017-02-09 6 views
2

(3.5)でさらにへつのリストから値を挿入:パイソン - 私はこのような長いリストがある場合、Pythonで事前定義されたスポット

long_list = ['0','1','0','1','0','0'.'0'.'1','1','0'] 

の数と長さが等しい短いリスト「このようなlong_listで1代、:私は新しいリストを作成する方法を

short_list = [8,7,6,5] 

ことがある指標のそれぞれで私のlong_listへの 『挿入』私short_listの値が 『1』、および用一貫性のために、long_listの '0'をある数字(例えば99)で "置き換え"ます。

私は驚異的なforループでこれを行うことができましたが、これをリストの理解度で効率的に行う方法があるようですね。

# bad solution 
new_list = [] 
x = 0 
for i in range(len(long_list)): 
    if long_list[i] == '0': 
     new_list.append(99) 
    else: 
     new_list.append(short_list[x]) 
     x += 1 

所望の出力:イテレータと使用リスト内包に

new_list = [99,8,99,7,99,99,99,6,5,99] 
+0

'' short_list'には、 '' long_list'に '' 1''という数だけの値が必ずありますか? – roganjosh

+0

はい、このアプリケーションのためです。短いリストは長いリストから得られます。実際の使用方法を説明するにはあまりにも多くの情報が必要です(上記の例は実際のデータを基にしたおもちゃの例です)。しかし、短いリストには1と同じ数の値があります。 – user1895076

答えて

8

電源を入れshort_listは、各'1'のためにそこから値を取得し、それ以外の使用は、固定値:

>>> long_list = ['0','1','0','1','0','0','0','1','1','0'] 
>>> short_list = [8,7,6,5] 
>>> it = iter(short_list) 
>>> [next(it) if x == '1' else 99 for x in long_list] 
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99] 

これは明らかにのみ動作しますshort_listが、にある1と同じ量以上の要素を持つ場合0。上記はO(n)時間複雑度nlong_listの要素の量である場合です。これは、すべての種類のイテラブルで同じように動作することに注意してください。long_listshort_listはジェネレータであり、最終結果は同じでした。

+0

ありがとう、これは素晴らしい作品と非常に高速です(私の実際の "long_list" 200,000 +アイテムの秒未満を取った)。イテレータをもっと頻繁に使うべきです。 – user1895076

3

あなたがshort_listを変更して問題がない場合は、list comprehensionを使用して次のことを試すことができます:

[short_list.pop(0) if i == '1' else 99 for i in long_list] 

出力:

>>> long_list = ['0', '1', '0', '1', '0', '0', '0', '1', '1', '0'] 
>>> short_list = [8, 7, 6, 5] 
>>> 
>>> [short_list.pop(0) if i == '1' else 99 for i in long_list] 
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99] 
0

ない、これが最善の方法であることを、新しい変数は必要ありません。

[99 if long_list[i] == '0' else short_list[long_list[:i].count('1')] 
for i in range(len(long_list))] 
関連する問題