2016-05-27 8 views
0

私はPython 3.5.xで配列を取得しようとしていますが、別の配列にキー属性が現れる順序でオブジェクトをソートしようとしています。これは言う:私はキーの属性名を持つオブジェクトx0、...、xNの配列Xを持っています。また、私はPythonリストの理解の出力配列の非標準的な順序

[x for x in X if x.name in Y] 

しかし、私はそれがないような方法でそうしたいリスト内包を行いたいのk < = Nと...、NK、名N0と名Yの配列を持っています順序xは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が順番にインデックスに登録されていない場合は、間違ったスコアを報告します。それは場合に役立ちます


問題のカスタムオブジェクトの形式は、(それが関連してはならない)、以下の通りです:だから

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

X_filterのソート順を決定しますリストの理解を行う前に、Nに対応するものがないアイテムの場合は0のような最終値)。 – BrenBarn

+0

@BrenBarn私はそれを考えましたが、リストはカスタムオブジェクトのものです。英数字のスタイルではないオブジェクトの標準的な順序付けをPythonが持っているかどうかはわかりません。 –

+1

'key'引数を使って' sort'を使って任意の比較方法を指定することができます。リスト作成の一環としてではなく、すでに作成されたリストでそれを実行しなければならないということだけです。 – BrenBarn

答えて

2

...私は、私は完全にはわかりません問題を理解するが、Yのような名前のリストです。あなたがインデックスに名前をマップする辞書にそれを回す場合は、より良いやる:

Y_map = {name: ix for ix, name in enumerate(Y)} 

今、私たちはXをフィルタリングするY_mapを使用することができます。

X_filter = (x for x in X if x.name in Y_map) 

そして、我々は再び Y_mapを使用することができますいくつかのDEFAを使用して(ちょうどそれを作成した後、あなたのリストをソートするために簡単で、または最初のリストXをソートします

sorted_X = sorted(X_filter, key=lambda x: Y_map[x.name])