Python 3.x 当字典具有提取所需的所有信息时,从字典列表返回元组列表的函数不起作用
有一个字典列表,每个字典包含: 名字 中名 姓 标题 地址 电子邮件地址 忠诚计划 一个客户 有些信息可能丢失了Python 3.x 当字典具有提取所需的所有信息时,从字典列表返回元组列表的函数不起作用,python-3.x,list,function,dictionary,information-extraction,Python 3.x,List,Function,Dictionary,Information Extraction,有一个字典列表,每个字典包含: 名字 中名 姓 标题 地址 电子邮件地址 忠诚计划 一个客户 有些信息可能丢失了 segment = [{'first-name': 'Elsa', 'last-name': 'Frost', 'title': 'Princess', 'address': '33 Castle Street, London', 'loyalty-program': 'Gold'}, {'first-name': 'Anna', 'last-name': 'Frost', 'tit
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\u clients
返回列表
而不是生成器
,您可以做两件事:
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):
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]