2012-04-02 6 views
2

私は2つのリストがあります:私はそれを削除し、L2の同じ位置にあるものは何でも削除するL1に「#」の存在する場合2つの同期リストから同じ位置(インデックス)のアイテムを削除しますか?

l1 = ['#', '1', '#', '!'] 
l2 = ['S', 'T', 'K', 'M'] 

を。

for i in range(len(li[j])): 
    for k in range(len(l2[n])): 
     if j == "#": 
      li.remove([j][i]) 
      l2.remove([n][k]) 

しかし、それはjが定義されていないと文句を言い: 私は(いくつかの他のものの間で)試してみました何です。 私は結果は次のようになりたい:

l1 = ['1', '!'] 
l2 = ['T', 'M'] 

私は提案を感謝されます!

+0

あなたは 'j'を設定するのですか?そして何に? –

+0

'li.remove'それは' l1'でループ変数は 'i'、' k'は 'j'なので' j'は定義されていません – avasal

答えて

1

は、ここでの方法を理解するために、シンプルで簡単です。

出力:

>>> 
('1', '2', '3') 
('b', 'd', 'e') 
+0

これはわかりやすい私の方法よりも。私のメソッドはinbuiltメソッドを利用するのに対し、各変数は繰り返し使用されるので、各変数は一度しか使用しないでください。名前、例えば。フィルターは、Pythonの経験を持つ人にとって、このメソッドを明確にするようです。 – jamylak

+0

@jamylak私はPythonの初心者ですが、それを2回圧縮するとシンプルなジェネレータを使用するよりも処理能力が向上します。 inbuilt関数はPythonコードより速いので、今は間違っているようです。 – bezmax

+0

もちろん、Pythonは必ずしも速度についてではありません。コードが読みやすくなるように速度を犠牲にすることもあります。 itertoolsからすべてのメソッドを使用した場合、ジップをジェネレータに変えることができ、データをリストに戻してこの例のために転記する必要はありませんが、それははるかに速く実行されます。 – jamylak

0

両方のリストで常に同じインデックスにアクセスするので、1つのループで十分ですが、リストの長さが同じでない場合は注意が必要です。

l1 = ['#', '1', '#', '!']  
l2 = ['S', 'T', 'K', 'M'] 
remove = [] 
for i in range(len(l1) - 1): 
    if l1[i] == '#': 
     remove.insert(0, i) 

for i in remove: 
    l1.pop(i) 
    l2.pop(i) 

for i in l1: 
    print i 
for i in l2: 
    print i 
6
>>> l1 = ['#', '1', '#', '!'] 
>>> l2 = ['S', 'T', 'K', 'M'] 

>>> l1,l2 = zip(*((x,y) for x,y in zip(l1,l2) if x!='#')) 
>>> l1 
('1', '!') 
>>> l2 
('T', 'M') 
:またそれを反復することは誤りがちであるが、以下の溶液ストアが除去リスト内のすべてのインデックス、リストから除去し、第二回で両方のリストからインデックスを削除します

使用filter

>>> l1,l2 = zip(*filter(lambda x: '#' not in x,zip(l1,l2))) 
>>> l1 
('1', '!') 
>>> l2 
('T', 'M') 

を使用して

itertools

(読み:「速い」)

a = ["#", "1", "#", "2", "3", "#"] 
b = ["a", "b", "c", "d", "e", "f"] 

a,b = zip(*[[a[i], b[i]] for i in range(len(a)) if a[i]!="#"]) 
print a 
print b 

は個人的に私はそれを見つける理解することは非常にsimplierとより効果:提案@jamylak方法よりも、