所有字典中的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