我正在创建一个函数,它接受两个列表和一个元组作为数据,并返回相对于第一个列表索引按递增顺序排序的数据(这对我的问题不是很重要,而是上下文)。以下是我的文件:
def sort_data(data):
""" (tuple) -> tuple
data is a tuple of two lists.
Returns a copy of the input tuple sorted in
non-decreasing order with respect to the
data[0]
>>> sort_data(([5, 1, 7], [1, 2, 3]))
([1, 5, 7], [2, 1, 3])
>>> sort_data(([2, 4, 8], [1, 2, 3]))
([2, 4, 8], [1, 2, 3])
>>> sort_data( ([11, 4, -5], [1, 2, 3]))
([-5, 4, 11], [3, 2, 1])
"""
([a,b,c],[d,e,f]) = data
x = [a,b,c]
y = [d,e,f]
xarray = np.array(x)
yarray = np.array(y)
x1 = np.argsort(xarray)
xsort = (xarray[x1])
ysort = (yarray[x1])
#remove array()
return ([xsort],[ysort])
这工作得很好,但返回非常轻微的错误。例如,我希望在我的docstring中看到:
>>> sort_data(([5, 1, 7], [1, 2, 3]))
([1, 5, 7], [2, 1, 3])
但是我得到了这个:
([array([1, 5, 7])], [array([2, 1, 3])])
我怎么能删除数组(),这样我就有两个列表在一个元组作为我的返回值?我试图将其转换为元组,但当我只想要一个元组时,它是两个元组。
In [78]: data = ([5, 1, 7], [1, 2, 3])
由于您使用的是argsort
,您可以将两行一起排序:
从列表创建一个数组:
In [79]: arr = np.array(data)
In [80]: arr
Out[80]:
array([[5, 1, 7],
[1, 2, 3]])
分类指数:
In [81]: idx = np.argsort(arr[0])
In [82]: idx
Out[82]: array([1, 0, 2])
In [83]: arr[:,idx]
Out[83]:
array([[1, 5, 7],
[2, 1, 3]])
将数组设置为list:
In [84]: arr[:,idx].tolist()
Out[84]: [[1, 5, 7], [2, 1, 3]]
既然给定了一个列表元组,那么应该有一种使用Pythonsorted
及其key
进行排序的方法。但是我还没有像numpy那样经常使用它。
我不知道这是不是最好的:
In [11]: data = ([5, 1, 7], [1, 2, 3])
排序第一个列表,同时记录索引:
In [12]: x=sorted([(v,i) for i,v in enumerate(data[0])], key=lambda x:x[0])
In [13]: x
Out[13]: [(1, 1), (5, 0), (7, 2)]
提取索引:
In [14]: idx = [i[1] for i in x]
In [15]: idx
Out[15]: [1, 0, 2]
返回两个子列表:
In [16]: [[d[i] for i in idx] for d in data]
Out[16]: [[1, 5, 7], [2, 1, 3]]