所有字典中的Python打印键
如果我有一个包含以下词典的文件:所有字典中的Python打印键,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,如果我有一个包含以下词典的文件: { "dict1" : { "data1" : "a", "data2" : "b", "data3" : "c", "data4" : "d", "data5" : "e" }, "dict2" : { "data1" : "f", "data2" : "g", "data3" : "h", "
{
"dict1" : {
"data1" : "a",
"data2" : "b",
"data3" : "c",
"data4" : "d",
"data5" : "e"
},
"dict2" : {
"data1" : "f",
"data2" : "g",
"data3" : "h",
"data4" : "i",
"data5" : "j"
}
>>> for value in maindict.values():
... print value
{"data1" : "a",
"data2" : "b",
"data3" : "c",
"data4" : "d",
"data5" : "e"}
{"data1" : "f",
"data2" : "g",
"data3" : "h",
"data4" : "i",
"data5" : "j"}
如何访问每个字典键“data3”。使输出为:
c, h
因为文件中有多个词典,所以我不知道名称。是否需要迭代它们来提取这些键?假设字典只嵌套一次(如示例中所示),您可以使用简单的列表理解,如下所示:
dct = [v["data3"] for v in oridict.values()]
这会在原始dict(
oridict
)中循环,将值存储到v
,这应该是另一个dict,然后对于原始dict中的每个值v
,它会得到“data3”
的值,假设您的dict是这样的(您忘记了关闭的)
:
只需使用生成器表达式:
>>> i_key = 'data3' # inner key
>>> for value in (dct[o_key][i_key] for o_key in dct if i_key in dct[o_key]):
... print(value)
h
c
如果嵌套字典中存在
data3
值,这将只打印该值,否则将直接跳过该值。因此,如果我理解正确,“dict1”和“dict2”是未知名称,数量未知,但它们每个都有一个“data3”,您想获取其值吗?(顺便说一下,“data3”是键,c和h是值)
要做到这一点,让我们假设整个内容都已读入并存储在,比如说,all_data
。如果您不知道如何执行此操作,我建议查看json
模块,因为它基本上是json格式的
for k,v in all_data.items():
# v will now hold the sub-dictionary, so we can just grab "data3":
print v.get('data3',"") # I used the .get() method incase "data3" doesn't exist
说明:
您的数据是一个字典maindict
,其中键是'dict1'
和'dict2'
>>> for key in maindict.keys():
... print key
dict1
dict2
我们对键不感兴趣,但需要值(实际上是另外两个字典):
要获取子字典中与键'data3'
对应的值:
>>> for subdict in maindict.values():
... print subdict['data3']
c
h
你说过你想要一个逗号分隔的结果。允许您使用其他字符作为分隔符连接字符串序列:
>>> ', '.join(['William', 'Shatner', 'Speaks', 'Like', 'This'])
'William, Shatner, Speaks, Like, This'
谜题的最后一部分是,我们可以使用创建生成器的方法动态生成序列:
>>> results = (subdict['data3'] for subdict in maindict.values())
>>> results
<generator object <genexpr> at 0x03115710>
因此,我们使用带有str.join
的生成器表达式:
>>> ', '.join(subdict['data3'] for subdict in maindict.values())
'c, h'
您还可以使用以下代码:
TargetKey= 'data3'
output = map(lambda D:S[D].get(TargetKey, ''), S )
', '.join(output) # or simply loop throw output
除了为使用
?您不知道哪些名称?包含内部dict的外部dict的键(“您的示例中的dict1”和“dict2”)?我从一个我定义为self.players的文件中加载它,我尝试了这些方法,但没有取得太大成功。为下面这样的词典创建一个名称是绝对必要的吗?即dct=。。。。你的字典是?你是说v.get(“data3”)
?哦,是的。修复。为什么不所有数据项()
iteritems
仅适用于2.x,而items
适用于2和3。公平点——我实际上只使用2.x,这就是我习惯于iteritems()的原因。编辑以改进。这很有效。但我真的不知道怎么做。你能给我解释一下吗?编辑:也谢谢你!!!解释补充道:“对不起,它有点长,对不起,原来的答案有点短。”(不!解释非常完美。我能够理解它,并且我认为我对生成器表达式和str.join有了更好的理解。我计划对我的代码进行注释,并提供一个指向此答案的链接,供其他人阅读。再次感谢!!有没有一种方法可以做到这一点,使您不必硬编码'data3'
,并可以将其扩展到我的代码中是否删除子分区中的所有现有键?我已经尝试了多种不同类型的循环,但无法实现work@user5359531我不确定我是否理解。你可能最好把它表述成一个新问题,包括输入、期望输出、实际输出和你所尝试过的。然后你就可以把整个问题都解决了flow正在处理你的问题,而不仅仅是一个小小的老我。这段代码非常不和谐,它在5个地方打断了pep8,并使用而不是列表comprehension@MSeifert我们不需要外部字典的键,oridict
。
>>> list(results)
['c', 'h']
>>> ', '.join(subdict['data3'] for subdict in maindict.values())
'c, h'
TargetKey= 'data3'
output = map(lambda D:S[D].get(TargetKey, ''), S )
', '.join(output) # or simply loop throw output