如何在Python列表中将近点分组

时间:2019-04-12 06:52:54

标签: python list-comprehension

我正在使用列表理解来获取列表。拉特说我正在使用以下代码行获取此列表:

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. 

2 个答案:

答案 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]
  

注意:这是一个坏主意。 (只是为了好玩:))