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
作为后缀来创建空列表如果我想控制要使用的值,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())]