当字典包含提取所需的所有信息时,从字典列表中返回元组列表的函数不起作用



有一个字典列表,每个字典包含:

名字中间名姓标题住址电子邮件地址忠诚度计划对于一个客户。

其中一些信息可能缺少

segment = [{'first-name': 'Elsa', 'last-name': 'Frost', 'title': 'Princess', 'address': '33 Castle Street, London', 'loyalty-program': 'Gold'}, {'first-name': 'Anna', 'last-name': 'Frost', 'title': 'Princess', 'loyalty-program': 'Platinum'}, {'first-name': 'Harry', 'middle-name': 'Harold', 'last-name': 'Hare', 'title': 'Mr', 'email-address': 'harry.harold@hare.name', 'loyalty-program': 'Silver'}]

对于有物理地址的客户,我需要提取一个元组列表。每个元组代表一个客户端,并包含它们的标题、名字、中间名和姓氏(如果定义的话(,以及邮件地址。

我的代码似乎在某些情况下有效,但在其他情况下无效。

何时:


segment = [{'first-name': 'Elsa', 'last-name': 'Frost', 'title': 'Princess', 'address': '33 Castle Street, London', 'loyalty-program': 'Gold'}, {'first-name': 'Anna', 'last-name': 'Frost', 'title': 'Princess', 'loyalty-program': 'Platinum'}, {'first-name': 'Harry', 'middle-name': 'Harold', 'last-name': 'Hare', 'title': 'Mr', 'email-address': 'harry.harold@hare.name', 'loyalty-program': 'Silver'}]

该代码似乎工作

def process_clients(segment):
new_list = []
new_tuple =()
for x in segment: #Focuses on the dictionary 
#Selects the name and address for clients with a registered address 
if "address" in x:
if "middle-name" in x:
new_tuple += (x["title"] + " " + x["first-name"] + " " + x["middle-name"] + " " + x["last-name"]), (x["address"])
else:
new_tuple += (x["title"] + " " + x["first-name"] + " "  + x["last-name"]), (x["address"])
new_list.append(new_tuple)
return new_list
process_clients(segment)

输出:

[[('Princess Elsa Frost', '33 Castle Street, London '),
('Princess Elsa Frost',
'33 Castle Street, London ',
'Princess Anna Frost',
'34 Castle Street, London ')]
process_clients(segment)

但是,如果缺少中间名以外的元素,则会生成键错误。我认为可以创建一个函数,从名称的每一个可能的部分组合中生成一个元组,我该怎么做呢?或者更好的是,我如何构建一个更简洁的函数

有没有一种方法可以更简洁地创建一个函数,

如果我得到了你想要的东西,你只需要用你的函数:

segment = [{'first-name': 'Elsa', 'last-name': 'Frost', 'title': 'Princess', 'address': '33 Castle Street, London', 'loyalty-program': 'Gold'}, {'first-name': 'Anna', 'last-name': 'Frost', 'title': 'Princess', 'loyalty-program': 'Platinum'}, {'first-name': 'Harry', 'middle-name': 'Harold', 'last-name': 'Hare', 'title': 'Mr', 'email-address': 'harry.harold@hare.name', 'loyalty-program': 'Silver'}]
def process_clients(segment):
for client in segment:
if "address" in client:
yield (' '.join(filter(bool, map(client.get, ("first-name", "middle-name", "last-name")))), client["address"])
list(process_clients(segment))

编辑:如果你宁愿从process_clients返回list而不是generator,你可以做两件事:

def process_clients(segment):
new_list = []
for client in segment:
if "address" in client:
new_list.append(
(' '.join(filter(bool, map(client.get, ("first-name", "middle-name", "last-name")))),
client["address"])
)
return new_list

def process_clients(segment):
return [(' '.join(filter(bool, map(client.get, ("first-name", "middle-name", "last-name")))), client["address"]) for client in segment if "address" in client]

最新更新