我有一個這樣的字典串列:
[{'User ID': '111',
'Full Name': 'name a',
'Role: Name': 'role a'},
{'User ID': '222',
'Full Name': 'name b',
'Role: Name': 'role a'},
{'User ID': '232',
'Full Name': 'name c',
'Role: Name': 'role b'},
{'User ID': '223',
'Full Name': 'name d',
'Role: Name': 'role d'},
{'User ID': '444',
'Full Name': 'name e',
'Role: Name': 'role d'}]
我已經使用這個問題的答案在串列中均勻地對角色進行了排序。但我也需要他們的“全名”。
所以基本上我需要按角色均勻地對字典進行排序,這可能與鏈接的答案有關嗎?
我不希望字典角色像[a, a, a, b, c, c],我想要它像[a,b,a,c,a,c]或這樣的東西。類似于鏈接問題的方式。
uj5u.com熱心網友回復:
使用代碼如下:
import pprint
import random
from functools import partial
from operator import itemgetter
data = [{'User ID': '111',
'Full Name': 'name a',
'Role: Name': 'role a'},
{'User ID': '222',
'Full Name': 'name b',
'Role: Name': 'role a'},
{'User ID': '232',
'Full Name': 'name c',
'Role: Name': 'role b'},
{'User ID': '223',
'Full Name': 'name d',
'Role: Name': 'role d'},
{'User ID': '444',
'Full Name': 'name e',
'Role: Name': 'role d'}]
def optimize(items, quality_function, stop=1000):
no_improvement = 0
best = 0
while no_improvement < stop:
i = random.randint(0, len(items) - 1)
j = random.randint(0, len(items) - 1)
copy = items[::]
copy[i], copy[j] = copy[j], copy[i]
q = quality_function(copy)
if q > best:
items, best = copy, q
no_improvement = 0
else:
no_improvement = 1
return items
def quality_maxmindist(items, key=None):
if key is None:
def identity(e): return e
key = identity
s = 0
for k, item in { key(item) : item for item in items}.items():
indcs = [i for i in range(len(items)) if key(items[i]) == k]
if len(indcs) > 1:
s = sum(1. / (indcs[i 1] - indcs[i]) for i in range(len(indcs) - 1))
return 1. / s
quality_fun = partial(quality_maxmindist, key=itemgetter("Role: Name"))
res = optimize(data, quality_fun)
pprint.pprint(res)
輸出
[{'Full Name': 'name a', 'Role: Name': 'role a', 'User ID': '111'},
{'Full Name': 'name d', 'Role: Name': 'role d', 'User ID': '223'},
{'Full Name': 'name c', 'Role: Name': 'role b', 'User ID': '232'},
{'Full Name': 'name b', 'Role: Name': 'role a', 'User ID': '222'},
{'Full Name': 'name e', 'Role: Name': 'role d', 'User ID': '444'}]
基本上,您key向函式添加一個引數quality_maxmindist(來自此處),此關鍵引數將用于確定專案如何相等。
在您的問題的特定情況下,您可以使用operator.itemgetteron "Role: Name",這樣具有相同角色的專案將被視為相等。請參閱下面帶有注釋的代碼更改:
def quality_maxmindist(items, key=None):
if key is None:
def identity(e): return e
key = identity
s = 0
# notice that you need to use a dictionary for finding unique items by key
for k, item in { key(item) : item for item in items}.items():
indcs = [i for i in range(len(items)) if key(items[i]) == k] # notice
if len(indcs) > 1:
s = sum(1. / (indcs[i 1] - indcs[i]) for i in range(len(indcs) - 1))
return 1. / s
quality_fun = partial(quality_maxmindist, key=itemgetter("Role: Name"))
res = optimize(data, quality_fun)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/347433.html
