2016-05-03 17 views
-3

iveはすべてのオブジェクトをリストに追加しましたが、ソートされていません。リスト内の項目をLevelNoで並べ替えたいので、1と2を並べ替えたいです。Python、リストするオブジェクトと並べ替え

取得エラーイムがある

Traceback (most recent call last): 
    File "pagerduty.py", line 143, in <module> 
    OnCallData = OnCallData.sort(key=operator.itemgetter('LevelNo')) 
NameError: name 'operator' is not defined 

私の現在のコードがある

from operator import itemgetter 
class User(object): 
    __attrs = ['Policy','Level', 'LevelNo', 'StartDate', 'EndDate', 'StartTime', 
       'EndTime', 'Name', 'Mobile'] 

    def __init__(self, **kwargs): 
     for attr in self.__attrs: 
      setattr(self, attr, kwargs.get(attr, None)) 

    def __repr__(self): 
     return ', '.join(
      ['%s: %r' % (attr, getattr(self, attr)) for attr in self.__attrs]) 


OnCallData = [] 
for UserItem in objPolicyData['users']: 
    UserData = User()  
    UserData.Name = UserItem['name'] 
    UserData.Mobile = UserMobile = getUserMobile(UserItem['id']) 
    for OnCall in UserItem['on_call']:  
     UserPolicy = OnCall['escalation_policy'] 
     PolicyName = UserPolicy['name'] 
     if PolicyName.lower().find('test') == -1:  
      UserData.Policy = PolicyName 
      UserData.LevelNo = OnCall['level'] 
      UserData.Level = getLevel(OnCall['level']) 
      UserData.StartDate = getDate(OnCall['start']) 
      UserData.EndDate = getDate(OnCall['end']) 
      UserData.StartTime = getTime(OnCall['start']) 
      UserData.EndTime = getTime(OnCall['end'])  
      OnCallData.append(UserData) 

OnCallData = sorted(OnCallData, key=itemgetter('LevelNo')) 

サンプルデータは、あなたがitemgetterをインポートする必要が

[ 
Policy: u'Network Team', Level: 'Backup On Call Engineer', LevelNo: 2, StartDate: 'Monday 02 May', EndDate: 'Monday 09 May', StartTime: '09:00AM', EndTime: '09:00AM', Name: u'John Smith', Mobile: u'07XXX', 
Policy: u'System Administator Team', Level: 'Primary On Call Engineer', LevelNo: 1, StartDate: 'Tuesday 03 May', EndDate: 'Tuesday 03 May', StartTime: '09:00AM', EndTime: '05:00PM', Name: u'Billy Bones', Mobile: u'07XXX', 
Policy: u'Network Team', Level: 'Primary On Call Engineer', LevelNo: 1, StartDate: 'Friday 29 April', EndDate: 'Tuesday 03 May', StartTime: '05:00PM', EndTime: '03:30PM', Name: u'Jim Bob', Mobile: '07XXX' 
] 
+0

重複質問 - http://stackoverflow.com/questions/19553091/python-error-on-operator-keyword –

+0

は、あなたも 'operator'モジュールをインポートしたことがありますか? –

+0

hiはいiveインポートされた項目ゲッター、コードを追加 – AlexW

答えて

1

私は、これはあまりにも

>>> sorted(a, key=lambda x: x['b']) 
[{'a': 1, 'c': 2, 'b': 3}, {'a': 1, 'c': 2, 'b': 4}] 
>>> 

はPS動作するはずだと思う:あなたのデータは、適切なPythonの構造体ではなかったので、私はダミーデータを使用します。あなたのケースでは

これは動作するはず

_OnCallData = sorted(OnCallData, key=lambda x: x.LevelNo) 
+0

どうすれば適切な構造体にデータを取得できますか? – AlexW

+0

@AlexW私は、リスト項目を作成するためにクラスを使用していて、各クラスをリストに動的に追加していますが、私は辞書(中括弧はデータに欠けている)のリストを文字列キー(キーには引用符がありません)で表しています。 –

+0

正しい構造体を得るために何か追加が必要ですか? – AlexW

1

です。最初にfrom operator import itemgetterをコードの先頭に追加します。

+0

それはすべてではありません。それは '演算子'を定義しません。 'itemgetter'を定義します。したがって、 'key = operator.itemgetter'は' key = itemgetter'に変更する必要があります – zondo

+0

元のコードは 'itemgetter'を直接使用していました:)とにかく、私は彼がそう思っているようなオブジェクトを使っているなら' attrgetter'さあ。 – tayfun

+0

興味深い。エラーは彼が 'operator.itemgetter'を使用したことを示しますが、コードは' itemgetter'を使用したことを示しています。 – zondo

0

だろう。

def update(): #This defines the update procedure 
    input_file=open("Scores.txt","r")  

    name=input("Enter name") #Uses variable to store name that is asked for 
    highScore=input("Enter current high score")  
    newHighscore=input("Enter new high score")  

    data=input_file.read().splitlines()      

    input_file.close  

    position=0 #Placing of the data at the start 

    found=False 
関連する問題