我有两个相等长度的列表:
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 :(得分:6)
一种方法是使用glDestroyShader
:
zip
如果for循环更适合,您可以创建两个空列表并有条件地将值附加到它们:
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)
答案 1 :(得分:1)
没有显式循环,创建两个?当然,如果我们使用临时对象:
/Section/*[LayoutRow = ../LayoutRow]
但是使用实际的for循环会更明显一点:
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)
答案 2 :(得分: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)
请注意,这是使用递归函数的一个非常糟糕的理由,你肯定应该使用上面的其他建议。
答案 3 :(得分: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
更好的想法可能是直接使用数据框来匹配每个元素与自己的标签。