Python 创建一个空列表并附加字典的所有子键

Python 创建一个空列表并附加字典的所有子键,python,python-3.x,python-2.7,dictionary,Python,Python 3.x,Python 2.7,Dictionary,我有一本字典,它有这样的子字典: d ={10L: {u'Owner Name': u'abc', u'Email': u'wa@gmail.com', u'Manager Name': u'jhon'}, 12L: {u'Owner Name': u'awdaw', u'Email': u'raghavpatnecha15@gmail.com', u'Manager Name': u'raghav'}} 所以当我做d[10][Owner Name]时,我得到了abc。但是这种模式会重复,我的

我有一本字典,它有这样的子字典:

d ={10L: {u'Owner Name': u'abc', u'Email': u'wa@gmail.com', u'Manager Name': u'jhon'}, 12L: {u'Owner Name': u'awdaw', u'Email': u'raghavpatnecha15@gmail.com', u'Manager Name': u'raghav'}}
所以当我做
d[10][Owner Name]
时,我得到了
abc
。但是这种模式会重复,我的意思是每个子字典都有相同的子键,每个子字典的长度相对来说是相同的。因此,如果我在id=10的sub-dict中添加几个参数,那么我将向其他键添加相同的参数

现在,我的问题是,每当子目录中的项目增加时,我必须创建一个空列表,并通过以下方式将其值附加到该列表中:

def getcontacts():
    id = [10, 12]
    Owner_names = []
    Emails = []
    Manager_Names = []  # to add more columns just add an empty list
    for j in id:
        Owner_names.append(d[j]['Owner Name'])
        Emails.append(d[j]['Email'])
        Manager_names.append(d[j]['Manager Name'])  # append to list
    return Owner_names, Emails, Manager_Names

names, emails, managers = get_contacts()
起初我认为这是一个很好的方法,但随着子字典中的项目不断增加,我需要创建一个空列表,并追加和返回它

有没有办法让这个过程自动化。因此,如果我有一个子键名
Product name
,我的函数可以自动创建一个空列表
Product\u name
,并像
Product\u name那样追加它。追加(d[j]['Product name'])
,然后在我通过以下方式调用get contacts时返回它:

所有者姓名、电子邮件、经理姓名、产品名称=获取联系人()

我是否可以在哪里编写一个函数:

  • 在我的字典中计算子键,并通过将
    s
    作为后缀来创建空列表

  • 将相应的值追加到列表中,并将其添加到return语句中

  • 更新


    如果我想控制要使用的值,defaultdict解决方案仍然会有帮助。目前我正在这样做:

    for name, email, manager in zip(names, emails, managers):
             print name, email , manager
             message = message_template.substitute(PERSON_NAME=name.title(),MANAGER_NAME=manager.title())
    
    假设我有两个列表:

    l1 = [u'abc', u'awdaw']
    l2 = [u'jhon', u'raghav']
    for name1,name2 in zip(l1,l2):
        print name1, name2
    
    但我不能压缩字典,原因很明显。默认dict如何帮助我使用我想要使用的值。所以我不想包括
    Owner\u Name
    我只想跳过这一行:

    message = message_template.substitute(MANAGER_NAME=manager.title())
    

    简单的解决方案:不是返回列表的元组,而是返回列表的dict,其中键是子键,值是收集的值的列表:

    from collections import defaultdict
    
    def get_contacts():
        id = [10, 12]
        results = defaultdict(list)
        for j in id:
            obj = d[j]
            for key, value in obj.items():
                results[key].append(value)
        return results
    
    results = get_contacts()
    for k, v in results.items():
        print("{} : {}".format(k, v))
    
    一般来说:当你认为你需要“动态名称”时,你真的需要一个dict

    编辑:

    =>

    乌德帕特: 因此,您希望返回的数据按照您期望的方式进行排序。 那么你需要告诉你的“数据”键你期望它们的顺序

    def get_contact(data, ids):
    ret_data = {}
    for i in ids:
        sub_data = data.get(i)
        for k in sub_data.keys():
            ret_data[k] = ret_data.get(k, [])
            ret_data[k].append(sub_data[k])
    
    return [ret_data[k] for k in sorted(ret_data.keys())]
    

    dict是无序的,因此不能依赖于
    dict.values()
    的顺序。此外,返回值仅意味着每次向dub dicts中添加内容时,您都必须更新
    get_contacts()
    调用的LHS。Bruno Desthuilliers的回答就可以了。如果不一定需要使用字典,还可以查看数据帧<代码>作为pd导入熊猫
    df=pd.DataFrame(d).T
    您需要查看一个OrderedICT(查找一个)。原因是一个普通的dict将以您不控制的顺序返回它的值/键(并且您想要这个动态)。但是想想看。。。您正在向数据dict添加一个键,并希望它作为返回参数,但您没有询问函数将其放置在何处!“如果我想控制要使用的值,defaultdict解决方案是否仍然有用”=>嗯,是的,当然是为什么???defaultdict。对比我的好:)这就行了。但当我调用get_contacts()时,我会得到单独的列表。使用我所做的
    用于名称、电子邮件、zip中的经理(所有者名称、电子邮件、经理名称):
    然后我将其命名为
    消息模板。替换(PERSON\u name=name.title(),manager\u name=manager.title())
    。我如何使用默认的dict来实现这一点呢?因为我仍然需要一个对我输入的键数的控制use@brunodesthuilliers你能看到更新吗?请“但问题是当我调用get_contacts()时,我会得到单独的列表”=>你仍然会得到单独的列表。唯一的区别是它们现在被命名为
    results[“Owner Name”]
    ,而不是
    names
    等。。。没有什么可以阻止您将它们绑定到您喜欢的任何名称,即
    names=results[“Owner name”]
    (参见我编辑的答案)。我也更喜欢使用默认dict,但问题是您和@Bruno desthuillers都以字典的形式返回结果。但我在脚本中进一步做的是,我在zip中列出:
    名称、电子邮件、经理(姓名、电子邮件、经理):
    并执行此操作
    message=message\u template.substitute(PERSON\u name=name.title()、manager\u name=manager.title())
    ,这样我可以更好地控制需要哪些值。我怎么能在你的字典里这么做呢?你要求get_contacts动态地从键返回值。你不会告诉get_联系人你希望他们以什么顺序返回给你。口述至少允许你审问这个结构。因此,要么使用OrderEdict,要么在结构中添加“orderby”键,这样就可以显式返回所需的内容。
    names, emails, managers = get_contacts()
    for name, email, manager in zip(names, emails, managers):
        # ...
    
    results = get_contacts()
    names, emails, managers = results["Owner Name"], results['Manager Name'], results["Email"]
    for name, email, manager in zip(names, emails, managers):
        # ...
    
    data ={10L: {u'Owner Name': u'abc', u'Email': u'wa@gmail.com', u'Manager Name': u'jhon'}, 
           12L: {u'Owner Name': u'awdaw', u'Email': u'raghavpatnecha15@gmail.com', u'Manager Name': u'raghav'}}
    
    def get_contact(data, ids):
        ret_data = {}
        for i in ids:
            sub_data = data.get(i)
            for k in sub_data.keys():
                ret_data[k] = ret_data.get(k, [])
                ret_data[k].append(sub_data[k])
    
        # Doing this will have unordered results so one would have to
        # throw data into an OrderedDict (from a 3rd party lib like boltons)
        # return [ret_data[k] for k in ret_data.keys()]
    
        # so make sense to return the dict
        return ret_data
    
    def get_contact(data, ids):
    ret_data = {}
    for i in ids:
        sub_data = data.get(i)
        for k in sub_data.keys():
            ret_data[k] = ret_data.get(k, [])
            ret_data[k].append(sub_data[k])
    
    return [ret_data[k] for k in sorted(ret_data.keys())]