Python 拆分字典字段

Python 拆分字典字段,python,sql-server,dictionary,split,Python,Sql Server,Dictionary,Split,我已经设法弄明白了如何运行SQL查询来显示信息。我需要保持数据与db表的格式相同,因此我认为应该使用字典。到目前为止,我的字段是ID和Name,我的打印内容如下所示: [{'ID': '123', 'Name': 'ROBERTSON*ROBERT'}, {'ID': '456', 'Name': 'MICHAELS*MIKE'}, {'ID': '789', 'Name': 'KRISTENSEN*KRISTEN'}, ...] 首先,我是否恰当地使用字典 接下来,我需要根据*分隔符拆分名称

我已经设法弄明白了如何运行SQL查询来显示信息。我需要保持数据与db表的格式相同,因此我认为应该使用字典。到目前为止,我的字段是ID和Name,我的打印内容如下所示:

[{'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()]
就像这样,也许:

query = [dict(zip(['ID', 'FirstName', 'LastName'], row[:1] + row[1].split('*'))) for row in cursor.fetchall()]
就像这样,也许:

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

如果所有条目的名称都被星号分割

解决方案分两步进行。检索当前结果后:

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'}]
否则(假设字段“Name”至少已填充)


如果所有条目的名称都被星号分割

解决方案分两步进行。检索当前结果后:

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'}]
否则(假设字段“Name”至少已填充)


首先,虽然您使用字典是有效的,但我建议使用namedtuples来表示带有命名字段的固定结构

   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]
从集合导入namedtuple
#结构类工厂
Person=namedtuple(“Person”,“id”,“name”))
people=[Person('123','ROBERTSON*ROBERT')、Person('456','MICHAELS*MIKE')、Person('789','KRISTENSEN*KRISTEN')]
#不同结构
PersonName=namedtuple(“Person”,“id”,“first”,“last”))
#结构转换
def人员到人员姓名(人员):
“”“转换人物->人名”“”
names=person.name.split('*'))
如果len(names)<2:#取决于您的默认值
last=姓名[0]
第一个=“”
else:#假设第一个字段是姓氏
最后,first=名字[:2]#即使有其他名字,也取前两名
return PersonName(person.id,first,last)
people\u names=[person\u to\u personname(person)表示person in people]

首先,虽然您使用字典是有效的,但我建议使用namedtuples来表示带有命名字段的固定结构

   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]
从集合导入namedtuple
#结构类工厂
Person=namedtuple(“Person”,“id”,“name”))
people=[Person('123','ROBERTSON*ROBERT')、Person('456','MICHAELS*MIKE')、Person('789','KRISTENSEN*KRISTEN')]
#不同结构
PersonName=namedtuple(“Person”,“id”,“first”,“last”))
#结构转换
def人员到人员姓名(人员):
“”“转换人物->人名”“”
names=person.name.split('*'))
如果len(names)<2:#取决于您的默认值
last=姓名[0]
第一个=“”
else:#假设第一个字段是姓氏
最后,first=名字[:2]#即使有其他名字,也取前两名
return PersonName(person.id,first,last)
people\u names=[person\u to\u personname(person)表示person in people]


可能对您没有帮助,但如果可能,我觉得最好的方法是将数据库更改为具有LastName和FirstName字段。如果只是那么简单@bouletta:-)可能对您没有帮助,但如果可能,我觉得最好的方法是将数据库更改为具有LastName和FirstName字段。如果只是这么简单的话@bouletta:-)
TypeError:只能将元组(非“列表”)连接到元组
TypeError:只能将元组(非“列表”)连接到元组
索引器:列表索引超出范围
它在我的示例中起作用,如果您的一个条目没有用
*
分隔的FirstName/LastName,那么它将失败:)。但你想如何处理这个案子?只有姓氏,没有名字存储在FirstName中?我编辑了我的答案,其行为与以前一样,在没有
*
的情况下,全名将存储在LastName中,FirstName将不存在。如果希望它存在,那么可以添加一个
else
语句并在其中放入一个空字符串。您也可以使用
try
except
语句代替if/else,但这可能有点过分。谢谢@bouletta。这很有效!没有错误,但我只打印了一条记录
{'ID':'123','LastName':'SMITH','FirstName':'ROBERT'}
索引器:列表索引超出范围
在我的示例中有效,如果您的一个条目没有用
*
分隔FirstName/LastName,那么它将失败:)。但你想如何处理这个案子?只有姓氏,没有名字存储在FirstName中?我编辑了我的答案,其行为与以前一样,在没有
*
的情况下,全名将存储在LastName中,FirstName将不存在。如果希望它存在,那么可以添加一个
else
语句并在其中放入一个空字符串。您也可以使用
try
except
语句代替if/else,但这可能有点过分。谢谢@bouletta。这很有效!没有错误,但我只打印了一条记录
{'ID':'123','LastName':'SMITH','FirstName':'ROBERT'}
类型错误:列表索引必须是整数或片,而不是str
我可以执行这段代码而不会出现任何错误:/也许是因为其中一些没有星号?有什么办法吗?
TypeError:列表索引必须是整数或片,而不是str
我可以执行这段代码而不会出现任何错误:/也许是因为其中一些没有星号?有办法吗?