2016-07-30 40 views
2

我具有相等长度的两个列表:如何基于python中的另一个列表删除列表中的元素,没有循环?

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

我想删除的元素<在list_b 0.7,同时去除从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

尝试同时迭代两个循环,将合格项过滤到结果列表(或两个)中。 – 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) 

如果一个for循环更适合,您可以创建两个空列表和有条件的价值附加到他们:

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 idx, value in enumerate(list_b): 
    if value =< 0.7: 
     list_a.pop(idx) 
     list_b.pop(idx) 

但你还是管理映射两个列表(基本上)键值。 这是一本字典的用途!整合这些清单,并与一些字典解析创建子集:

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

3种方法令人鼓舞!谢谢。 –

+0

我发现,通过使用包含3,828个元素的长列表的for循环,我无法立即删除所有<0.7的元素。每次运行代码时,列表的长度都会减少。只有四次跑完后,所有小于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 

和更好的想法可能是直接用一个数据帧与自己品牌的每个元素相匹配。

相关问题