如何获取列表中索引的"relative position"?



我正在尝试获取索引在列表中的相对位置。这些清单的长度各不相同。假设我们有两个列表:

>>> list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

元素3在两个列表中的索引为:

>>> list1.index(3)
3
>>> list2.index(3)
3

"绝对位置"都是3,但常识表明,由于每个列表的长度不同,它们的相对位置也会不同。

我所做的只是简单地将两个列表按其最大的元素划分,并创建一个字典,将原始元素映射到新创建的相对位置。

>>> list1_norm = {key: value for (key, value) in zip(list1, [(x / max(list1)) for x in list1])}
>>> list2_norm = {key: value for (key, value) in zip(list2, [(x / max(list2)) for x in list2])}
>>> list1_norm
{0: 0.0,
1: 0.1111111111111111,
2: 0.2222222222222222,
3: 0.3333333333333333,
4: 0.4444444444444444,
5: 0.5555555555555556,
6: 0.6666666666666666,
7: 0.7777777777777778,
8: 0.8888888888888888,
9: 1.0}
>>> list2_norm
{0: 0.0,
1: 0.07142857142857142,
2: 0.14285714285714285,
3: 0.21428571428571427,
4: 0.2857142857142857,
5: 0.35714285714285715,
6: 0.42857142857142855,
7: 0.5,
8: 0.5714285714285714,
9: 0.6428571428571429,
10: 0.7142857142857143,
11: 0.7857142857142857,
12: 0.8571428571428571,
13: 0.9285714285714286,
14: 1.0}

它现在给了我们:

>>> list1_norm.index(3)

现在我们知道3相对于列表长度的位置是每个列表的0.33330.21428

有没有其他方法可以让我实现同样的概念,而不必执行乏味的列表和字典理解?谢谢

将索引除以负1 的长度

def rel_index(l, elem):
return l.index(elem)/(len(l) - 1)

用法:

list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
print(rel_index(list1, 3))
print(rel_index(list2, 3))

输出:

0.3333333333333333
0.2

这将均匀地展开/指定从0.0到1.0的元素。

如果您想将元素从1/n均匀分布到1.0,请使用以下

def rel_index(l, elem):
return (l.index(elem) + 1)/(len(l))

对于初学者来说,如果你愿意的话,你可以完全避免理解和dict。你可以简单地创建一个函数(或者lambda,如果你想让它保持一个实现相同逻辑的单行:

>>> list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> rel_pos = lambda l, elem: elem / max(l)
>>> rel_pos(list1, 5)
0.5555555555555556

您可以考虑的另一件事是将其作为一种方法来实现您自己的类——您可以在自己的类中实现您想要的任何查找方法。例如:

>>> import collections
>>> class MyList(collections.UserList):
...     def rel_pos(self, elem):
...         return elem / max(self)
...
>>> my_list1 = MyList(list1)
>>> my_list1.rel_pos(5)
0.5555555555555556

这两种解决方案都可能呈现出与您想要的完全相同的行为,但您可以根据自己的需要自由实现。

最新更新