Python列表推导输出数组

时间:2016-05-27 21:23:53

标签: python list-comprehension

我正在尝试在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 = []

1 个答案:

答案 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])