通过索引访问Python字典的元素

时间:2011-03-23 11:40:02

标签: python dictionary

考虑像

这样的词典
mydict = {
  'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
  'Grapes':{'Arabian':'25','Indian':'20'} }

如何访问此词典的特定元素? 例如,我想在格式化苹果的第一个元素之后打印第一个元素,在我们的例子中只是'美国'?

其他信息 上面的数据结构是通过在python函数中解析输入文件而创建的。一旦创建,它对于该运行保持不变。

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

因此,如果文件发生更改,则下次运行此应用程序时,文件的内容会有所不同,因此该数据结构的内容将不同,但格式相同。 所以你看我在我的功能中我不知道Apple中的第一个元素是'美国'或其他任何东西所以我不能直接使用'美国'作为关键。

11 个答案:

答案 0 :(得分:104)

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

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

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

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

答案 1 :(得分:23)

如果问题是,如果我知道我有一个包含'Apple'作为水果和'美国'作为一种苹果的词典,我会用:

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


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

正如其他人所说。如果问题是,你不知道当你在dict数据结构的dict中读取任意文件时,'Apple'作为水果和'美国'作为'Apple'类型存在,你可以做类似的事情:

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

或者更好,所以如果你知道只有Apple有类型的美国人,你就不会不必要地遍历完整的dicts字典:

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

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

http://docs.python.org/dev/library/collections.html#collections.OrderedDict

答案 2 :(得分:17)

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

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

答案 3 :(得分:9)

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

在pypi上有一些有趣的库,这里有quick search

在您的具体情况下,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

答案 4 :(得分:8)

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

答案 5 :(得分:4)

您不能依赖词典上的订单。但你可以试试这个:

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

如果您希望保留订单,可能需要使用以下内容: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api

答案 6 :(得分:2)

我知道这是8岁,但似乎没有人真正阅读并回答过这个问题。

您可以在字典上调用.values()以获得内部字典的列表,从而按索引访问它们。

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

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

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

答案 7 :(得分:0)

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

创建词典

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 Dictionaries and learn interactively here...

答案 8 :(得分:0)

尽管对此问题有很多答案,但很少有人指出字典是无序的映射,因此(直到使用Python 3.7的插入顺序受到祝福),“字典字面意义不大。甚至OrderedDict也只能通过使用诸如mydict[mydict.keys()[0]]这样的丑陋的数字索引来访问(仅Python 2,因为在Python 3中keys()是不可下标的迭代器。)

From 3.7 onwards以及在3,6中的实践中-随后引入了新行为,但直到3.7才包含在语言规范中-在字典的键,值或项(以及,我相信,还有一个集合)将首先产生最近插入的对象。仍然没有简单的方法可以通过数字插入索引来访问它们。

关于选择和“格式化”项目的问题,如果您知道要在字典中检索的密钥,通常将其用作下标来检索它(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'])

但是如果您知道要查找键“ Apple”,为什么不使用字典呢?

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

答案 9 :(得分:0)

使用以下小功能,挖掘树状字典变得非常容易:

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

请注意,您可以轻松地更改(甚至参数化)“。”中的分隔符char。到“ /”,“ |”等

答案 10 :(得分:0)

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

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