2016-05-24 5 views
4

この問題を回避するには問題があります。複数のリストで最小値の一意索引を取得する

それぞれn個の要素を含むn個のリストがあります。 各リストについて、最小値のインデックスを見つけて新しいリストに格納する必要があります。これは簡単です。

問題は、インデックスリスト内の2つ以上の値が同じである可能性があるということです。私は一意の値を持つリストが必要です。 2つ(またはそれ以上)の値が等しい場合は、最小値の小数点からのインデックス値に優先順位を付ける必要があります。

例:

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の2番目の値に基づいて、リスト4に最小値があることが分かります。インデックスリストは[0、?、?、2]のようになります。

さらに、私は値1と3で疑問符を埋める必要がありますが、どこに行くのですか?検査の結果、13694.0(リスト3のインデックス1)が111161.8(リスト2のインデックス1)より小さく、各リストの3番目のインデックス値が等しいので、リスト3からインデックス1を選択する必要があります。

つまり、私の新しいインデックスリストは[0、?、1,2]です。ただ1つの疑問符が残っていると、私はこれを3で埋める。これは[0,3,1,2]を与える。

リストはほとんどが小さくなるため、実行時間は実際には問題ではありません。

答えて

4

すべてのリストを3つのメンバータプル(値、myListsのリストのインデックス、リストの値のインデックス)の形式でマージし、値でソートしました。私のコードの時間複雑さは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] 
関連する問題