2017-02-14 80 views
1

我已經弄清楚如何運行SQL查詢來顯示信息。我需要將數據保存爲與db表相同的格式,所以我認爲我應該使用字典。到目前爲止,我的字段名和姓名,我打印看起來是這樣的:Split字段字段

[{'ID': '123', 'Name': 'ROBERTSON*ROBERT'}, {'ID': '456', 'Name': 'MICHAELS*MIKE'}, {'ID': '789', 'Name': 'KRISTENSEN*KRISTEN'}, ...] 

首先,我會適當地使用字典嗎?

接下來,我需要根據*定界符分割名稱字段。例如:

前:

{'ID': '789', 'Name': 'KRISTENSEN*KRISTEN'} 

後:

{'ID': '789', 'LastName': 'KRISTENSEN', 'FirstName': 'KRISTEN'} 

我已經測試了代碼,我發現了一些東西,但不斷撞擊路障。我用這個來創建我的字典,我想知道如果我在這一行中包含分割來減少一個步驟?

query = [dict(zip(['ID', 'Name'],row)) for row in cursor.fetchall()] 
+0

可能不幫你,但如果可能我覺得最好的辦法是改變你的數據庫有一個姓氏和名字字段。 – bouletta

+0

如果它只是那麼容易@bouletta :-) –

回答

0

像這樣也許:

query = [dict(zip(['ID', 'FirstName', 'LastName'], row[:1] + row[1].split('*'))) for row in cursor.fetchall()] 
+0

'TypeError:只能連接元組(不是「列表」)到元組' –

0

如果所有項目都通過一個星號

一個解決方案分兩步拆分名。一旦檢索當前的結果:

a = [{'ID': '123', 'Name': 'ROBERTSON*ROBERT'}, {'ID': '456', 'Name': 'MICHAELS*MIKE'}, {'ID': '789', 'Name': 'KRISTENSEN*KRISTEN'}] 

result = [{'ID' : entry['ID'], 'LastName' : entry['Name'].split('*')[0], 'FirstName' : entry['Name'].split('*')[1]} for entry in a] 
現在如果打印結果

[{'FirstName': 'ROBERT', 'ID': '123', 'LastName': 'ROBERTSON'}, 
{'FirstName': 'MIKE', 'ID': '456', 'LastName': 'MICHAELS'}, 
{'FirstName': 'KRISTEN', 'ID': '789', 'LastName': 'KRISTENSEN'}] 

否則(假設場 '名稱' 是人口最少的)

results = [] 

for entry in a: 
    name = entry['Name'].split('*') 

    result = dict(ID = entry['ID'], LastName = name[0]) 

    if len(name) > 1: 
     result['FirstName'] = name[1] 

    results.append(result) 
+0

'IndexError:列表索引超出範圍' –

+0

它適用於我的例子,它會失敗if你的一個條目沒有名字/姓氏,用'*'分開 – bouletta

+0

是的,許多人不會這樣做。有什麼辦法呢? –

0
db_dict = {'ID': '789', 'Name': 'KRISTENSEN*KRISTEN'} 
name = db_dict['Name'] 

def split_name(name): 
    for index, char in enumerate(name): 
     if char == '*': 
      position = index 

    last_name = name[:position] 
    first_name = name[position + 1:] 

    return {'LastName':last_name, 'FirstName':first_name} 

new_db_dict = {db_dict.keys()[0] : db_dict.values()[0]} 
new_db_dict.update(split_name(name)) 
print new_db_dict 
+0

'TypeError:列表索引必須是整數或切片,而不是str' –

+0

我可以執行這段代碼而不會出現任何錯誤:/ – mistakeNot

+0

也許是因爲其中有些沒有星號?有什麼辦法呢? –

0

首先,雖然您使用的字典是有效的,但我建議使用namedtuples for r Epresenting固定結構與命名字段

from collections import namedtuple 
    # structure class factory 
    Person = namedtuple("Person", ("id", "name")) 
    people = [ Person('123', 'ROBERTSON*ROBERT'), Person('456','MICHAELS*MIKE'), Person('789', 'KRISTENSEN*KRISTEN')] 
    # different structure 
    PersonName = namedtuple("Person", ("id", "first", "last")) 
    # structure transformation 
    def person_to_personname(person): 
     """Transform Person -> PersonName""" 
     names = person.name.split('*') 
     if len(names) < 2: # depends on your defaults 
      last = names[0] 
      first = '' 
     else: # assumes first field is last name 
      last, first = names[:2] # even if other names present, takes first two 
     return PersonName(person.id, first, last) 
    people_names = [person_to_personname(person) for person in people]