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

时间:2018-10-23 08:19:41

标签: python list sorting

我的输入形式为:

[[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]和{之间的差异最小{1}}。

编辑2

elem[0]

给出:

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]))

现在,我需要做的是,在重复第一个元素的情况下,使该对与第二个元素最小。我该怎么办?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用list comprehension

>>> [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]]

然后sort

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

答案 2 :(得分: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)

答案 3 :(得分:0)

您可以执行以下操作:

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)

答案 4 :(得分:0)

您可以通过将列表本身与列表压缩在一起但分开一个索引来配对列表中的相邻项目,并且由于您显然希望最后一个项目(尽管没有下一个项目要与之比较),因此您可以手动将其添加到反转后列出,以便始终匹配。以下示例假定您的列表存储在变量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构造函数将dict项转换为子列表的列表:

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()))