我有一個多維陣列,如果它們具有相同的第零個索引,我想在其中回傳第二個索引的最大值的第一個索引。例如:
array = [[ 0, 2, 54]
[ 0, 3, 83]
[ 0, 4, 92]
[ 1, 5, 52]
[ 1, 6, 28]
[ 2, 7, 20]
[ 2, 8, 22]
我希望它回傳:4,5,8(基本上,第零個索引是該行所屬的類別,第一個索引是我希望它回傳的,基于相同第零個類別的第二個索引中的最大值)
我不知道如何開始為不包括我所嘗試的內容而道歉。
uj5u.com熱心網友回復:
作為一個答案已經發布,我們設定了一些東西:
from itertools import groupby
from operator import itemgetter
array = [[ 0, 2, 54],
[ 0, 3, 83],
[ 0, 4, 92],
[ 1, 5, 52],
[ 1, 6, 28],
[ 2, 7, 20],
[ 2, 8, 22]]
然后我們可以使用串列決議單行來做到這一點:
>>> [max(v, key=itemgetter(2)[1] for _, v in groupby(sorted(array, key=itemgetter(0)), itemgetter(0))]
[4, 5, 8]
>>>
首先,我們按每個子串列中的第一個元素對二維串列進行排序。然后我們按第一個元素對它們進行分組。現在我們遍歷這些組,根據第三個元素找到每個組中的最大子串列,然后從每個組中提取第二個元素。
uj5u.com熱心網友回復:
您可以使用哈希圖(字典)來跟蹤最大值和第二個索引,以便在 O(n) 時間內完成此操作。嘗試這個:
array = [[ 0, 2, 54],
[ 0, 3, 83],
[ 0, 4, 92],
[ 1, 5, 52],
[ 1, 6, 28],
[ 2, 7, 20],
[ 2, 8, 22]]
def get_max_second_indices(array):
# We are going to populate this in the format {zero_index: {second_index: index, max_third: max}}
final_values = {}
for sublist in array:
# Check if the final_values contains the zero index
if final_values.get(sublist[0], None) is None:
final_values[sublist[0]] = {"second_index": sublist[1], "max": sublist[2]}
else:
if sublist[2] > final_values[sublist[0]]['max']:
final_values[sublist[0]] = {"second_index": sublist[1], "max": sublist[2]}
result = []
for i in sorted(final_values):
result.append(final_values[i]['second_index'])
return result
print(get_max_second_indices(array))
(回傳[4,5,8])
uj5u.com熱心網友回復:
使用字典的簡單方法。將第一個和第二個索引存盤在字典的第零個索引鍵中。比較第 2 個索引并在必要時替換每個第 0 個索引。
d = {}
for i, j, k in array:
if i in d:
if d[i][1] < k:
d[i] = j, k
else:
d[i] = j, k
這會將最大值存盤在j字典的值中。
[j for j, k in d.values()]
# [4, 5, 8]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486088.html
