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]