3

我的一个常见问题如下:

作为输入我有(n是一些 int >1

W = numpy.array(...)
L = list(...)

在哪里

len(W) == n
>> true
shape(L)[0] == n
>> true

我想对L关于值W和比较器的列表进行排序。我的想法是执行以下操作:

def my_zip_sort(W,L):
    srt = argsort(W)
    return zip(L[srt],W[srt])

这应该像这样工作:

a = ['a', 'b', 'c', 'd']
b = zeros(4)
b[0]=3;b[1]=2;b[2]=[1];b[3]=4
my_zip_sort(a,b)
>> [(c,1)(b,2)(a,3)(d,4)]

但这不是,因为

TypeError: only integer arrays with one element can be converted to an index

因此,我需要做另一个循环:

def my_zip_sort(W,L):
    srt = argsort(W)
    res = list()
    for i in L:
        res.append((L[srt[i]],W[srt[i]]))
    return res

我找到了一个关于 a的线程MaskableList,但这对我不起作用(正如您可以在评论中看到的那样),因为我不仅需要保留或丢弃列表中的特定值,还需要重新排序它们:

a.__class__
>> msk.MaskableList
srt = argsort(b)
a[srt]
>> ['a', 'b', 'd']

结论:

我想找到一种方法来list通过约束对对象进行排序array。我自己找到了一种方法,除了列表索引之外,这有点好。你能帮我写一个同样适用MaskableList于这个任务的类,它有很好的性能吗?

4

1 回答 1

1

您无需扩展即可list避免for-loop。如果您期望新的Alist-comprehension就足够了,并且可能是您在这里可以做的最好listtuples

def my_zip_sort(W, L):
    srt = argsort(W)
    return [(L[i], W[i]) for i in srt]

例子:

n = 5
W = np.random.randint(10,size=5)
L = [chr(ord('A') + i) for i in W]

L # => ['A', 'C', 'H', 'G', 'C']

srt = np.argsort(W)
result = [(L[i], W[i]) for i in srt]


print result
[('A', 0), ('C', 2), ('C', 2), ('G', 6), ('H', 7)]
于 2013-02-02T20:36:09.307 回答