2016-07-30 5 views
2

私は同じ長さの二つのリストを持っている:私は2番目のリストを知ってlist_bで0.7 <私は要素を削除したいループのない、Pythonの別のリストに基づいてリスト内の要素を削除するにはどうすればいいですか?

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 

、そして同時にlist_aから対応する要素を削除する、すなわち

list_a_2 = ['b','d'] 
list_b_2 = [3.1, 4.1] 

list_b_2 = [item for item in hem if item > 0.7]. 

ループを使用せずにlist_a_2を取得する方法はありますか?

+0

ループを使用しないでください。実際にはそうではありません...明示的に記述しなくても、ループはおそらくどこかで使用されます –

+0

両方のループを同時に反復し、適格な項目を結果リスト(または2つ)にフィルタリングしてみてください。 – GManNickG

答えて

6

一つの方法は、zipを使用することです:

list_a_2, list_b_2 = zip(*[(a, b) for a, b in zip(list_a, list_b) if b > 0.7])  
list_a_2 
# ('b', 'd') 

list_b_2 
# (3.1, 4.1) 

ループの方が適している場合、あなたは2つの空のリストを作成し、条件付きでそれらに値を追加することができます:明示的なループなし

list_a_2, list_b_2 = [], [] 
for a, b in zip(list_a, list_b): 
    if b > 0.7: 
     list_a_2.append(a) 
     list_b_2.append(b) 

list_a_2 
# ['b', 'd'] 

list_b_2 
# [3.1, 4.1] 
+0

助けてくれてありがとう。 –

+0

ジェネレータの表現を使って、怠け者にしましょう! –

1

両方を作成しますか?確かに、我々は一時的なオブジェクトを使用する場合:もう少し明らかであろう

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 
tmp = zip(a, b) 
list_a_2 = [x[0] for x in tmp if x[1] > 0.7] 
list_b_2 = [x[1] for x in tmp if x[1] > 0.7] 
del tmp 

しかし、実際のforループを使用して:

for idx, value in enumerate(list_b): 
    if value =< 0.7: 
     list_a.pop(idx) 
     list_b.pop(idx) 

しかし、あなたはまだマッピングのための2つのリストを管理している(基本的に)キーを値に設定します。 これは辞書のためのものです!これらのリストを統合し、いくつかの辞書理解して、あなたのサブセットを作成する:あなたは本当にあなたが再帰関数を使用することができ、ループを回避したい場合

{x:y for x, y in zip(list_a, list_b) if y > 0.7} 
+0

3つの方法が刺激的です!ありがとうございました。 –

+0

私は、for-loopを3,828要素の長いリストで使用すると、すべての要素<0.7をすぐに削除できないことがわかりました。コードを実行するたびに、リストの長さが下がりました。 4回走った後でさえ、0.7未満の全ての数字が追い出されます。この問題を避けることができますか? –

+1

リストをループしている間にリストから要素を削除することは良い考えではありません。要素を削除するたびに、リストの長さが変わり、実際にはチェックせずにいくつかの要素にジャンプします。 – Psidom

0

あなたのよう呼び出すことができます
def unnecessarily_recursive_function(list_a,list_b): 
    try: 
     a = list_a.pop(0) 
     b = list_b.pop(0) 
     tmp_a, tmp_b = unnecessarily_recursive_function(list_a,list_b) 
     if b < 0.7: 
      return [a] + tmp_a, [b] + tmp_b 
     else: 
      return tmp_a, tmp_b 
    except IndexError: 
     return [],[] 

list_a, list_b = unnecessarily_recursive_function(list_a, list_b) 

これは再帰関数を使用することは本当に悪い理由であり、実際には上記の他の提案と一緒に行ってください。

0

ありがとうございます!同じ問題を抱えて他の人々のために:

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 
tmp = zip(a, b) 
list_a_2 = [x[0] for x in tmp if x[1] > 0.7] 
list_b_2 = [x[1] for x in tmp if x[1] > 0.7] 
del tmp 

し、直接、独自のラベルで各要素を一致させるためにデータフレームを使用される可能性があります良いアイデア:

私は、次のコードで終わります。

関連する問題