繁体   English   中英

从列表列表构造连续对的列表

[英]Construct list of consecutive pairs from list of lists

我有以下形式的输入:

[[41.0, 42.0], [42.0, 17.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]

我该如何对这些对进行排序并仅保留连续的对( 连续的意思是[a, b] ,其中b是下一个元素,大于a ,但不一定以1为增量。 )。

编辑:我的尝试:

test_lst = [[41.0, 42.0], [42.0, 17.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]
new_lst = []
for elem in test_lst:
    if elem[1] > elem[0]:
        new_lst.append(elem)

new_lst如下所示:

[[41.0, 42.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]

现在,例如,对于组[17.0, 46.0][17.0, 29.0] ,我只想在列表中保留第二个,因此elem[1]elem[0]之间的差异最小。

编辑2

test_lst = [[41.0, 42.0], [42.0, 17.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]

sorted_lst = sorted(test_lst, key = lambda x: int(x[0]))

这使:

[[6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 46.0], [17.0, 29.0], [29.0, 30.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [41.0, 42.0], [42.0, 17.0], [46.0, 47.0]]

现在,我需要做的是,在重复第一个元素的情况下,将对保持最小的第二个元素。 我怎样才能做到这一点?

由于涉及浮点数,因此在检查精确相等性时应采取一些预防措施:

e = 0.0000001  # some epsilon value accounting for imprecision
sorted(x for x in lst if abs(x[1]-x[0]-1) <= e)
# [[6.0, 7.0], [29.0, 30.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [41.0, 42.0], [46.0, 47.0]]

使用清单理解

>>> [x for x in a if x[0] + 1 == x[1]]
[[41.0, 42.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [6.0, 7.0], [29.0, 30.0]]

然后对其进行排序

>>> sorted([x for x in a if x[0] + 1 == x[1]], key=lambda x: x[0])
[[6.0, 7.0], [29.0, 30.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [41.0, 42.0], [46.0, 47.0]]
outer_list = [[41.0, 42.0], [42.0, 17.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]
new_outer_list = []
for inner_list in outer_list:
    if inner_list[0]+1 == inner_list[1]:
        new_outer_list.append(inner_list)

您可以执行以下操作:

values = [[41.0, 42.0], [42.0, 17.0], [17.0, 46.0], [46.0, 47.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [36.0, 7.0], [36.0, 6.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]

sortedValues = []

for value in values:
    if value[1] > value[0]:
        sortedValues.append(value)

print(sortedValues)

您可以通过将列表本身与列表压缩在一起但分开一个索引来配对列表中的相邻项目,并且由于您显然希望最后一个项目(尽管没有下一个项目要与之比较),因此您可以在反转后手动将其添加到列表中使其始终匹配。 以下示例假定您的列表存储在变量lst

[[a, b] for (a, b), (n, _) in zip(lst, lst[1:] + [lst[-1][::-1]]) if b == n and b > a]

返回:

[[41.0, 42.0], [17.0, 46.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0]]

请注意,预期输出中的第三项[46.0, 47.0]不正确,因为它在原始列表中实际上紧随其后是[33.0, 34.0] ,其第一个元素不是47.0

如果要在第一项重复时保留第二项最小的项,则可以按第一项的顺序对列表进行排序,然后以相反的顺序对第二项进行排序,以便可以使用dict构造函数转换列表将两个项目的子列表组合成字典以消除重复项,然后通过将字典项目映射到list构造函数将字典项转换为子list

list(map(list, dict(sorted([(a, b) for (a, b), (n, _) in zip(lst, lst[1:] + [lst[-1][::-1]]) if b == n and b > a], key=lambda t: (t[0], -t[1]))).items()))

返回:

[[6.0, 7.0], [7.0, 12.0], [12.0, 17.0], [17.0, 29.0], [29.0, 30.0], [33.0, 34.0], [34.0, 35.0], [35.0, 36.0], [41.0, 42.0]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM