所以我有一个如下列表:
points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
我一直在使用
points.sort(key=lambda pair: pair[0])
对列表进行排序。但是这只是在不看第二个值的情况下按第一个值排序。
此代码的结果如下:
[[0, 0], [0, 5], [0, 2], [1, 3], [5, 3], [5, 3]]
但是,我想排序的结果是:
[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3], [5, 3]]
我该怎么做?
此外,虽然我们在此,但如何从此列表中删除重复项?最终结果应该是:
[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]
答案 0 :(得分:5)
Python已经按字典顺序对可迭代容器(元组,列表,...)和字符串进行排序。
>>> points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
>>> sorted(points)
[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3], [5, 3]]
答案 1 :(得分:1)
您可以拥有一个首先按第一个元素x[0]
排序的排序键,如果它们是关系,则按第二个元素x[1]
排序:
>>> points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3], [0, 4]]
>>> sorted(points, key = lambda x: (x[0], x[1]))
[[0, 0], [0, 2], [0, 4], [0, 5], [1, 3], [5, 3], [5, 3]]
如果您不想在此最终列表中找到任何重复项,那么您可以这样做:
points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
sorted_lst = sorted(points, key = lambda x: (x[0], x[1]))
seen = set()
no_dups = []
for lst in sorted_lst:
curr = tuple(lst)
if curr not in seen:
no_dups.append(lst)
seen.add(curr)
print(no_dups)
# [[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]
其中有一组seen
用于跟踪已添加的子列表,以及列表no_dups
,其中列表已添加。如果某个元素不在seen
中并将其添加到最终列表中,则将其添加到seen
,这表示该元素已添加。
此外,由于类型list
不是可散列类型,因此无法将它们直接添加到集合中。在上面的代码中,列表将转换为元组并添加到seen
,这是一个可哈希类型。
答案 2 :(得分:1)
import itertools
points = [[0, 0], [5, 3], [0, 5], [0, 2], [1, 3], [5, 3]]
points.sort()
nList = list(points for points,_ in itertools.groupby(points))
print nList
结果:
[[0, 0], [0, 2], [0, 5], [1, 3], [5, 3]]
答案 3 :(得分:0)
尝试itemgetter
from operator import itemgetter
sorted(points, key=itemgetter(0, 1))