在多个列表中获取最小值的唯一索引

时间:2016-05-24 16:54:09

标签: python list

我在解决这个问题时遇到了一些麻烦。

我们说我有n个列表,每个列表包含n个元素。 对于每个列表,我需要找到最小值的索引并将它们存储在新列表中。这很容易。

问题是,我的索引列表中的两个或多个值可能相等。我需要一个具有唯一值的列表。如果两个(或更多)值相等,我想优先考虑来自较小最小值的索引值。

示例:

myLists = []
myLists.append([113.6, 12262.6, 21466.7, 141419.9])      # list 1
myLists.append([122284.8, 111161.8, 106581.1, 141419.9]) # list 2
myLists.append([25427.9, 13694.0, 5148.9, 141419.9])     # list 3
myLists.append([21354.9, 10599.2, 0.1, 141419.9])        # list 4

这会给我索引列表[0,2,2,2]。根据列表2,3和4中的第二个值,我看到最小值在列表4中,所以我的索引列表应该看起来像[0,?,?,2]。

更进一步,我需要用值1和3填写问号,但是哪个会在哪里?从检查开始,我看到自13694.0(列表3中的索引1)小于111161.8(列表2中的索引1)并且每个列表中的第三个索引值相等,我应该从列表3中选择索引1。

这意味着我的新索引列表是[0,?,1,2]。只留下一个问号,我用3填充。这给出了[0,3,1,2]。

列表大多数都很小,因此运行时间并不是真正的问题。

1 个答案:

答案 0 :(得分:4)

我以3个成员元组(值,myList中的列表索引,列表中的值索引)的形式合并了所有列表,并按值对其进行了排序。我的代码的时间复杂度是 nlog(n)

myLists = []
myLists.append([113.6, 12262.6, 21466.7, 141419.9])  # list 1
myLists.append([122284.8, 111161.8, 106581.1, 141419.9])  # list 2
myLists.append([25427.9, 13694.0, 5148.9, 141419.9])  # list 3
myLists.append([21354.9, 10599.2, 0.1, 141419.9])  # list 4

merged_list = list()

for index1, ls in enumerate(myLists):
    for index2, x in enumerate(ls):
        merged_list.append((x, index1, index2))

merged_list.sort()

st = set()  #to store already added indices

res = [-1 for i in range(len(myLists))]

for x, y, z in merged_list:
    if res[y] != -1 or z in st:
        continue
    res[y] = z
    st.add(z)

print(res)

输出 -

[0, 3, 1, 2]