通过索引访问 Python dictionary 的元素

比如说

mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }

例如,我如何访问这个字典的特定元素? 例如,我想打印的第一个元素后,一些格式的苹果的第一个元素,在我们的情况下是’美国’只?

附加信息 上面的数据结构是通过解析 python 函数中的输入文件创建的。然而,一旦创建了它,它对于该运行仍然是相同的。

我在函数中使用这个数据结构。

因此,如果文件发生变化,下次运行这个应用程序时,文件的内容会不同,因此这个数据结构的内容会不同,但格式是相同的。 所以你看,在我的函数中,我不知道苹果的第一个元素是“美国”或者其他什么,所以我不能直接使用“美国”作为键。

603976 次浏览

您可以使用 mydict['Apple'].keys()[0]来获得 Apple字典中的第一个键,但是不能保证它是 American。字典中键的顺序可以根据字典的内容和键被添加的顺序而改变。

你不能依赖字典的顺序,但是你可以试试这个:

mydict['Apple'].items()[0][0]

如果您希望保留订单,可以使用以下命令: Http://www.python.org/dev/peps/pep-0372/#ordered-dict-api

鉴于它是一本字典,你可以通过使用键来访问它。将字典存储在“ Apple”下,执行以下操作:

>>> mydict["Apple"]
{'American': '16', 'Mexican': 10, 'Chinese': 5}

他们中有多少是美国人(16人) ,这样做:

>>> mydict["Apple"]["American"]
'16'

如果问题是,如果我知道自己有一套词典,把苹果(Apple)当作水果,把美国(American)当作苹果,我会用:

myDict = {'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }




print myDict['Apple']['American']

就像其他人建议的那样。如果相反的问题是,你不知道是否“苹果”作为一个水果和“美国人”作为一种类型的“苹果”存在,当你读入一个任意的文件到你的结果表数据结构,你可以这样做:

print [ftype['American'] for f,ftype in myDict.iteritems() if f == 'Apple' and 'American' in ftype]

或者更好的是,如果你知道只有苹果公司才有美国风格,那么你就不会不必要地重复整个字典:

if 'Apple' in myDict:
if 'American' in myDict['Apple']:
print myDict['Apple']['American']

在所有这些情况下,字典实际存储条目的顺序并不重要。如果您真的关心订单,那么您可以考虑使用 OrderedDict:

Http://docs.python.org/dev/library/collections.html#collections

正如我注意到你的描述,你只知道你的解析器会给你一个字典,它的值是字典太像这样:

sampleDict = {
"key1": {"key10": "value10", "key11": "value11"},
"key2": {"key20": "value20", "key21": "value21"}
}

所以你必须在你的父词典上迭代。如果您想打印或访问 sampleDict.values()列表中的所有第一个字典键,您可以使用以下内容:

for key, value in sampleDict.items():
print value.keys()[0]

如果您只想访问 sampleDict.values()中第一个项目的第一个键,这可能是有用的:

print sampleDict.values()[0].keys()[0]

如果你用你在问题中给出的例子,我的意思是:

sampleDict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'}
}

第一个代码的输出是:

American
Indian

第二个代码的输出是:

American

编辑1:

上面的代码示例不适用于 python 的版本3及以上版本; 因为从版本3开始,python 将方法 keysvalues的输出类型从 list更改为 dict_valuesdict_values类型不接受索引,但它是可迭代的。因此,你需要改变以上代码如下:

第一:

for key, value in sampleDict.items():
print(list(value.keys())[0])

第二:

print(list(list(sampleDict.values())[0].keys())[0])

作为奖励,我想提供一种不同的解决方案来解决你的问题。您似乎正在处理嵌套字典,这通常是乏味的,特别是当您必须检查是否存在内部键时。

在 Pypi 上有一些关于这个的有趣的库,这里有一个 快速搜索给你。

在您的特定情况下,Dict _ digger似乎适合。

>>> import dict_digger
>>> d = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'}
}


>>> print(dict_digger.dig(d, 'Apple','American'))
16
>>> print(dict_digger.dig(d, 'Grapes','American'))
None

理解如何访问字典中的元素的简单示例:-

创建字典

d = {'dog' : 'bark', 'cat' : 'meow' }
print(d.get('cat'))
print(d.get('lion'))
print(d.get('lion', 'Not in the dictionary'))
print(d.get('lion', 'NA'))
print(d.get('dog', 'NA'))

了解更多关于 Python 字典和交互式学习在这里..。的信息

我知道这是8岁,但似乎没有人实际上已经阅读和回答的问题。

你可以打电话。Value ()来获取内部字典的列表,从而通过索引访问它们。

>>> mydict = {
...  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
...  'Grapes':{'Arabian':'25','Indian':'20'} }


>>>mylist = list(mydict.values())
>>>mylist[0]
{'American':'16', 'Mexican':10, 'Chinese':5},
>>>mylist[1]
{'Arabian':'25','Indian':'20'}


>>>myInnerList1 = list(mylist[0].values())
>>>myInnerList1
['16', 10, 5]
>>>myInnerList2 = list(mylist[1].values())
>>>myInnerList2
['25', '20']

尽管这个问题有很多答案,但似乎很少有人指出字典是无序的映射,因此(直到 Python 3.7插入顺序的祝福)字典中“第一个”条目的想法毫无意义。甚至 OrderedDict也只能通过使用 mydict[mydict.keys()[0]]这样丑陋的数字索引来访问(只能使用 Python 2,因为在 Python 3中,keys()是一个不可订阅的迭代器)

从3.7开始 ,实际上在3.6中也是如此——新的行为是在那时引入的,但是直到3.7遍遍遍遍地重复一个 dict (我相信也是一个集合)的关键字、值或者条目,才会首先产生最近插入的对象,这才被包括在语言规范中。目前仍然没有简单的方法来访问它们的数字索引插入。

至于选择和“格式化”项的问题,如果你知道你想在字典中检索的关键字,你通常会使用该关键字作为下标来检索它(my_var = mydict['Apple'])。

如果您确实希望能够通过条目编号对条目进行索引(忽略一个特定条目的编号会随着插入的进行而改变的事实) ,那么合适的结构可能是一个由两个元素组成的元组列表。而不是

mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }

你可以使用:

mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]

在这种情况下,第一个条目是经典的列表后缀形式的 mylist[0],它的值是 ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})。您可以循环遍历整个列表,如下所示:

for (key, value) in mylist:  # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])

但是如果你知道你正在寻找“苹果”这个关键词,为什么你不直接使用“ dict”呢?

您可以通过缓存键列表引入额外的间接级别,但是保持两个数据结构同步的复杂性将不可避免地增加代码的复杂性。

使用以下小功能,挖掘一个树形字典变得相当容易:

def dig(tree, path):
for key in path.split("."):
if isinstance(tree, dict) and tree.get(key):
tree = tree[key]
else:
return None
return tree

现在,dig(mydict, "Apple.Mexican")返回 10,而 dig(mydict, "Grape")生成子树 {'Arabian':'25','Indian':'20'}。如果字典中没有包含键,则 dig返回 None

请注意,您可以很容易地将分隔符字符从“ .”改为“/”,“ |”等。

mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }


for n in mydict:
print(mydict[n])