Python 1d 列表索引:增强 MaskableList

3 投票
1 回答
660 浏览
提问于 2025-04-17 14:32

我常遇到一个问题:

输入是这样的(n 是一个大于1的整数):

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

其中:

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

我想根据W的值和一个比较器来对列表L进行排序。我的想法是这样做:

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

我找到了一条关于MaskableList讨论,但对我来说并不适用(你可以在评论中看到),因为我不仅需要保留或丢弃列表中的特定值,还需要重新排序它们:

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

总结:

我想找到一种方法,通过一个array中的约束来对一个list中的对象进行排序。我自己找到了一种方法,虽然不错,但在列表索引方面有些问题。你能帮我写一个类似于MaskableList的类来完成这个任务,并且性能要好么?

1 个回答

1

你不需要去扩展 list 来避免使用 for 循环。使用 list-comprehension 就足够了,而且这可能是你在这里能做的最好的选择,特别是当你想要得到一个新的 list,里面装的是 tuples 的时候。

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

撰写回答