2013-06-06 56 views
0

我正在嘗試使用列表理解將行的不同部分切分爲字典列表。下面的代碼不起作用,但它說明了我正在嘗試做什麼。任何幫助將非常感激!通過列表理解解析一行到字典

感謝

def getDataElements(self): 
    return [x for x for line in self.data: {"Number": line[0:9], 
      "FullName": line[9:27].rstrip(), 
      "LastName": line[27:63].rstrip(), 
      "Area": line[63:65].rstrip(), 
      "City": line[65:90].rstrip(), 
      "Status": line[91], 
      "Status2": line[92], 
      "Status3": line[93]] 

回答

1

有些情況下列表解析是好的,但這不是其中之一。只需使用一個循環和發電機:

for line in self.data: 
    yield { 
     "Number": line[0:9], 
     "FullName": line[9:27].rstrip(), 
     "LastName": line[27:63].rstrip(), 
     "Area": line[63:65].rstrip(), 
     "City": line[65:90].rstrip(), 
     "Status": line[91], 
     "Status2": line[92], 
     "Status3": line[93] 
    } 

如果您確實需要返回一個列表,通過輸出通過list()

output_list = list(self.getDataElements()) 

如果你不舒服的是,總有追加-to-A-列表方式:

people = [] 

for line in self.data: 
    people.append({ 
     "Number": line[0:9], 
     "FullName": line[9:27].rstrip(), 
     "LastName": line[27:63].rstrip(), 
     "Area": line[63:65].rstrip(), 
     "City": line[65:90].rstrip(), 
     "Status": line[91], 
     "Status2": line[92], 
     "Status3": line[93] 
    }) 

return people 
2

你是有點清楚,但你必須把字典中開始......如果我完全理解你想要什麼,下面應該工作:

return [{"Number": line[0:9],"FullName": line[9:27].rstrip(),"LastName": line[27:63].rstrip(),"Area": line[63:65].rstrip(),"City": line[65:90].rstrip(),"Status": line[91],"Status2": line[92],"Status3": line[93]} for line in self.data] 

除非有一些額外的嵌套級別,因爲你說x for x for line,但你沒有使用x,所以我以這種方式忽略它。讓我知道,如果這是不正確的,如果是這樣解釋一點更詳細請!

1

首先編寫解析一個line並返回相應的字典功能:

def parseDataLine(self, line): 
    return { ... } # Same as your parsing code. 

你的代碼的其餘部分會是這樣的:

def getDataElements(self): 
    return [self.parseDataLine(line) for line in self.data] 

這種類型的方法使一切可讀性非常簡單。