我有兩個具有相同數量元素的串列。在第一個串列中,一個元素代表一種類別型別。在第二個串列中,一個元素代表一種費用。指數是相互對應的。
例如:
category_list = [1, 2, 2, 1, 3, 3, 3, 4, 2]
cost_list = [30, 45, 21, 22, 21, 32, 11, 12, 13, 11]
在我為每個類別挑選一個的條件下,我想使成本最小化。我怎樣才能實作這一點呢?更快,更好。謝謝你的幫助。
uj5u.com熱心網友回復:
我推薦了這個代碼。在這里,我們使用python中的預置方法'zip'來迭代獲得category_list和cost_list,所以我想這是很好的做法,然后我使用條件運算式來創建我的邏輯。首先,我想確定在我的x_dict中已經存在的類別,在運算式為真時,我使用'min'預建方法來比較已經存在的值和相關鍵的新值。所以它對管理我們的邏輯很有幫助。否則,該鍵不存在,那么我們就可以首次添加鍵值對。字典的鍵必須是唯一的,這就是為什么我們使用這種邏輯。
category_list = [1, 2, 2, 1, 3, 3, 3, 4, 2]
cost_list = [30, 45, 21, 22, 21, 32, 11, 12, 13, 11]
x_dict=dict()
for cat,cost in zip(category_list,cost_list)。
if cat in x_dict:
x_dict[cat]=min(x_dict[cat],cost)
else:
x_dict[cat]=cost
print(x_dict)
輸出
{1: 22, 2: 11, 3: 11, 4: 13}
我們可以直接使用 zip 方法并將其轉換為字典。它可以過濾唯一的鍵,但情況是它給出了相關鍵的最后一個值,我們使用它就像下面給出的那樣。
x=dict(zip(category_list,cost_list)
print(x)
輸出
{1: 22, 2: 11, 3: 12, 4: 13}
。
你可以看到給定串列的最后一個費用被分配到相關類別。這就是我們的代碼中的邏輯。
uj5u.com熱心網友回復:
你可以在一個dict中存盤每個類別的最低成本。
category_list = [1, 2, 2, 1, 3, 3, 3, 4, 2]
cost_list = [30, 45, 21, 22, 21, 32, 11, 12, 13, 11]
min_cst = dict()
for cat, cst in zip(category_list, cost_list)。
if cat in min_cst:
min_cst[cat] = min(min_cst[cat], cst)
else:
min_cst[cat] = cst
print(min_cst)
# {1: 22, 2: 11, 3: 11, 4: 13}。
時間復雜度是O(N),空間復雜度是O(N)。
uj5u.com熱心網友回復:
由于已經有三個使用dict的幾乎相同的答案,這里有一個使用min的不同的答案,每個類別只有一次:
category_list = [1, 2, 2, 1, 3, 3, 3, 4, 2]
cost_list = [30, 45, 21, 22, 21, 32, 11, 12, 13, 11]
pick_indices = [min((i for i in range(len(cost_list)) if category_list[i] == cat), key=lambda i: cost_list[i]) for cat in set(category_list)]
pick_totalcost = sum(cost_list[i] fori in pick_indices)
或者說:
pick_costs = [min(cost fori, (cost,cat) in enumerate(zip(cost_list, category_list)) if cat == c) for c in set(category_list)]
pick_totalcost = sum(pick_costs)
uj5u.com熱心網友回復:
解決方案1:
你可以遍歷category_list,并將cost_list的最小值保存在一個字典中,這個字典的鍵是category_list,你可以使用dictionary.get(),并用字典中之前存在的最小值替換min。
category_list = [1, 2, 2, 1, 3, 3, 3, 4, 2]
cost_list = [30, 45, 21, 22, 21, 32, 11, 12, 13, 11]
dct_min={}。
for idx in range(len(category_list)):
min_item = dct_min.get(category_list[idx], cost_list[idx])
# alternative solution by thanks @Stef.
# min_item = dct_min.setdefault(category_list[idx], cost_list[idx]); if cost_list[idx] < min_item: .../span>
if cost_list[idx] <= min_item:
dct_min[category_list[idx]] = cost_list[idx] 。
print(dct_min)
輸出:
{1: 22, 2: 11, 3: 11, 4: 13}。
解決方案2。(你可以使用
標籤:zip然后對tuple進行排序index0然后index1并將排序后的tuple轉換成dictionary,我們知道在dictionary中我們只有一個key。
zip_lsts = list(zip(category_list, cost_list)
dict(sorted(zip_lsts, key=lambda element: (element[0], element[1]),reverse=True)
# {4: 13, 3: 11, 2: 11, 1: 22}。
