我正在尝试在Python 3.5.x中获取一个数组,以按键属性出现在另一个数组中的顺序对某些对象进行排序。这就是说:我有一个对象x0,...,xN的数组X,带有键属性名。我还有一个名为Y的名字数组Y,...,nk,其中k <= N.我希望列表理解
[x for x in X if x.name in Y]
但是我希望以这样的方式这样做:它不按照X中出现的顺序排序,而是按x.name的顺序出现在Y中。所以如果x0对应于n2而x2对应于n0 ,我希望x2首先出现在我的数组中。
我的代码的具体实现如下
names = []
classes = []
class_dict = {'SC': 0, 'TT': 1, 'P': 2, 'S': 3, 'DB': 4, 'AT': 5}
t_score = 0
while True:
# This code takes inputs and populates the name list Y
team = [char for char in chars if char.name in names] #Here is the list comprehension
for char in team:
char.compute() #This just populates the attributes .SC et al with values
for i in range(T):
t_score += team[i].skills[classes[i]]
print(team[i].skills[classes[i]])
print('This team\'s score is {}'.format(t_score))
最后一段代码计算了一个团队分数,但不幸的是,由于理解的首选顺序,如果你没有以相同的顺序输入名称,它会提取错误的属性,即如果样本xi没有列在通过越来越多的索引nj命令报告错误的分数。
有问题的自定义对象的形式如下,如果有帮助(但它不应该相关):
class Character(object):
def __init__(self, name, idnum):
self.name = name
self.SC = 0
self.TT = 0
self.P = 0
self.S = 0
self.DB = 0
self.AT = 0
self.skills = [self.SC, self.TT, self.P, self.S, self.DB, self.AT]
self.SC_skills = []
self.TT_skills = []
self.P_skills = []
self.S_skills = []
self.P_skills = []
self.DB_skills = []
self.AT_skills = []
答案 0 :(得分:2)
所以......我不确定我是否完全理解这个问题,但看起来Y
是一个名单。如果将其转换为将名称映射到索引的dict,您会做得更好:
Y_map = {name: ix for ix, name in enumerate(Y)}
现在我们可以使用Y_map
来过滤X
:
X_filter = (x for x in X if x.name in Y_map)
然后我们可以再次使用Y_map
来确定X_filter
的排序顺序:
sorted_X = sorted(X_filter, key=lambda x: Y_map[x.name])