Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—如何按另一个列表的最后一个元素对列表进行排序?_Python_Sorting_Vector - Fatal编程技术网

Python—如何按另一个列表的最后一个元素对列表进行排序?

Python—如何按另一个列表的最后一个元素对列表进行排序?,python,sorting,vector,Python,Sorting,Vector,我有一个n个值向量的列表和一个n个时间向量的列表。我想根据每个值向量的最后一个元素对时间向量进行排序。我想在每个时间向量上附加相应值向量的最后一个元素,然后使用 time_vector.sort(key=lambda x: x[-1]) #or time_vector.sort(key=itemgetter(-1)) 最后弹出每个时间向量的最后一个元素。 然而,我认为必须有一个更简单的方式来做到这一点。在sort和sorted的Python参考中,我还没有找到任何关于这个问题的例子 使用Ale

我有一个n个值向量的列表和一个n个时间向量的列表。我想根据每个值向量的最后一个元素对时间向量进行排序。我想在每个时间向量上附加相应值向量的最后一个元素,然后使用

time_vector.sort(key=lambda x: x[-1]) #or
time_vector.sort(key=itemgetter(-1))
最后弹出每个时间向量的最后一个元素。 然而,我认为必须有一个更简单的方式来做到这一点。在sort和sorted的Python参考中,我还没有找到任何关于这个问题的例子

使用Alex Martelli提出的解决方案展开问题。因为我必须对值向量v_v和时间向量t_v进行重新排序,Alex提供了一个一站式解决方案

(v_v, t_v) = zip(*sorted (zip(v_v, t_v),key=lambda v: v[0][-1]))
我不明白解压是如何工作的,但我只是从Python的文档中复制了它,它可以工作。另外一个问题是,为什么使用itemgetter()而不是lambda不起作用,为什么使用vector.sort()方法而不是使用sorted()函数不起作用

我用来测试上述的数值例子如下

v_v = [[1, 2], [2, 3], [3, 1], [5, 3, 4]]
t_v = [[1, 1], [5, 6], [9, 8], [3, 10, 1]]
这将生成

v_v = ([3, 1], [1, 2], [2, 3], [5, 3, 4])
t_v = ([9, 8], [1, 1], [5, 6], [3, 10, 1])

因为这两个向量是——而且显然需要保持不变!——单独的,这是一个好的旧DSU的案例——装饰,分类,不装饰

result = [t for v, t in
          sorted(zip(value_vector, time_vector), key=lambda vt: vt[0][-1])]
添加
key=
arg几乎消除了在大多数情况下理解DSU的需要——它为您完成了装饰(只要它只是每个项目的一个函数)以及排序后的取消装饰

但是在这里,排序键是而不是只是项的一个函数——它是项在列表中的位置的函数,您可以使用它来索引一个单独的平行列表(Python中非常不寻常的数据排列)。然而,你想要对时间进行排序(即使它们本身与期望的顺序毫无关系!)——这是困难的关键

备选,考虑排序的位置,然后使用那些重新排序的时间。这可能感觉不那么奇怪:-)。它可以折叠成一条语句,但如果以两条语句呈现,则可能更清晰:

idx_val = sorted(enumerate(value_vector), key=lambda i, v: v[-1])
result = [times_vector[i] for i, _ in idx_val]
我认为这可能更清楚,因为
idx_val
(正确排序的
(索引,值)
对的列表,我们实际上并不关心
值,但需要它来排序)没有“粘在”时代上,然后必须再次被撕掉——我们只是在列表中使用索引。命名和分为两个步骤很有帮助

(当然,如果你是一个“一句话统治一切”的恶魔,你可以用
sorted
来代替
idx\u val
的名字,然后回到一句话——没有任何真正的好处,但是,对于错误的人来说,“cool”:-)]

补充:DSU的另一个伪装是
OrderedDict
——实际上是一种“去装饰”的不同方式。但是有一位评论者提到了它,所以这里是-,你可以判断它是否有任何价值

import collections
od = collections.OrderedDict(
    sorted(zip(value_vector, time_vector),
           key=lambda v, t: v[-1]))
result = list(od.values())

我实际上认为,通过在
dict
子类的keys/values播放中隐藏未修饰的内容,它会使事情变得更加模糊。但是,de gustibus…

因为这两个向量是——而且显然需要保留!——单独的,这是一个好的旧DSU的案例——装饰,分类,不装饰

result = [t for v, t in
          sorted(zip(value_vector, time_vector), key=lambda vt: vt[0][-1])]
添加
key=
arg几乎消除了在大多数情况下理解DSU的需要——它为您完成了装饰(只要它只是每个项目的一个函数)以及排序后的取消装饰

但是在这里,排序键是而不是只是项的一个函数——它是项在列表中的位置的函数,您可以使用它来索引一个单独的平行列表(Python中非常不寻常的数据排列)。然而,你想要对时间进行排序(即使它们本身与期望的顺序毫无关系!)——这是困难的关键

备选,考虑排序的位置,然后使用那些重新排序的时间。这可能感觉不那么奇怪:-)。它可以折叠成一条语句,但如果以两条语句呈现,则可能更清晰:

idx_val = sorted(enumerate(value_vector), key=lambda i, v: v[-1])
result = [times_vector[i] for i, _ in idx_val]
我认为这可能更清楚,因为
idx_val
(正确排序的
(索引,值)
对的列表,我们实际上并不关心
值,但需要它来排序)没有“粘在”时代上,然后必须再次被撕掉——我们只是在列表中使用索引。命名和分为两个步骤很有帮助

(当然,如果你是一个“一句话统治一切”的恶魔,你可以用
sorted
来代替
idx\u val
的名字,然后回到一句话——没有任何真正的好处,但是,对于错误的人来说,“cool”:-)]

补充:DSU的另一个伪装是
OrderedDict
——实际上是一种“去装饰”的不同方式。但是有一位评论者提到了它,所以这里是-,你可以判断它是否有任何价值

import collections
od = collections.OrderedDict(
    sorted(zip(value_vector, time_vector),
           key=lambda v, t: v[-1]))
result = list(od.values())

我实际上认为,通过在
dict
子类的keys/values播放中隐藏未修饰的内容,它会使事情变得更加模糊。但是,de gustibus…

时间向量.sort(key=lambda x:x[-1])
如果这是一个好方法的话。为什么它对你不起作用?
n
有多大?@PavelReznikov,排序
time\u vector
(其值,Q表明,与所需顺序无关)忽略
值\u vector
(其最后一项是所需顺序的唯一决定因素,同样根据Q)显然无法工作。
lambda
获取一个
x
,这是
时间向量的一项
——它应该忽略它,而是以某种方式获取
值向量的对应项(最后一个子项)
——如何
time\u vector.sort(key=lambda x:x[-1])
。W