我正在使用列表理解来获取列表。拉特说我正在使用以下代码行获取此列表:
quality, angle, distance = measurements[i]
new_data = [each_value for each_value in measurements[i:i + 20] if angle <= each_value[1] <= angle + 30 and
distance - 150 <= each_value[2] <= distance + 150]
其中测量是一个大数据集,其中包含(质量,角度,距离)对。从中我得到那些价值。
desired_list= [(1,2,3)(1,5,3),(1,8,3)(1,10,3),(1,16,3),(1,17,3)]]
现在如何在列表理解中添加新条件,以便仅当角度在某个偏移值之内时才得到该值?假设两个角度之间的差小于或等于5,则将它们放入desirable_list。
在这种情况下,我的列表应如下所示:
desired_list= [(1,2,3)(1,5,3),(1,8,3)(1,10,3)]
导致2到5、5到8、8到10的距离小于或等于5。
但是不包括最后两点,因为它们打破了(1,10,3)之后的条件,并且不需要检查。
我该如何实现?请帮助我
Note: it doesn't need to be in the same list comprehension.
答案 0 :(得分:2)
您提到的数据集很大。取决于您希望避免从头开始创建新列表而只搜索相关索引的大小。
<div className="loginSection">
... other stuff here ...
<Connect(Component) />
... other stuff here ...
</div>
答案 1 :(得分:1)
如果您的意思是从头到尾遍历,并在一对邻居违反规则时爆发。
这是没有list comprehension
的方法:
desired_list = [(1, 2, 3), (1, 5, 3), (1, 8, 3), (1, 10, 3), (1, 16, 3), (1, 17, 3)]
res = [desired_list[0]]
for a, b in zip(desired_list[:-1], desired_list[1:]):
if abs(a[1] - b[1]) > 5:
break
res += [b]
print(res)
输出:
[(1, 2, 3), (1, 5, 3), (1, 8, 3), (1, 10, 3)]
如果您坚持使用list comprehension
来休息,这是录制最后一对的解决方案:
res = [last.pop() and last.append(b) or b for last in [[desired_list[0]]] for a, b in
zip([desired_list[0]] + desired_list, desired_list) if abs(a[1] - b[1]) <= 5 and a == last[0]]
另一个版本使用end
条件:
res = [b for end in [[]] for a, b in zip([desired_list[0]] + desired_list, desired_list) if
(False if end or abs(a[1] - b[1]) <= 5 else end.append(42)) or not end and abs(a[1] - b[1]) <= 5]
注意:这是一个坏主意。 (只是为了好玩:))