有一个字典列表,每个字典包含:
名字中间名姓标题住址电子邮件地址忠诚度计划对于一个客户。
其中一些信息可能缺少
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]