如何在python中获取字典中的键位置

时间:2016-03-18 16:59:48

标签: python dictionary ordereddictionary

如果字典中存在密钥,我想知道密钥的位置,即数字索引。例如:

如果字典包含:

{'test':{1,3},'test2':{2},'test3':{2,3}}

if 'test' in dictionary:
   print(the index of that key)

例如,输出为0。 (' test3' ...)

的输出为2

我目前正在使用字典,我猜测我必须使用有序dict来执行此操作,但我怎样才能使用有序{{}} { {1}}?

感谢您的帮助。

6 个答案:

答案 0 :(得分:8)

对于Python< 3.6,你不能这样做,因为Python中的词典没有订单,因此项目没有索引。你可以使用OrderedDict库中的collections来代替它,并传递一个元组元组:

>>> import collections
>>> d = collections.OrderedDict((('test',{1,3}),('test2',{2}),('test3',{2,3})))
>>> d.keys().index('test3') # Replace with list(d.keys()).index("test3") for Python 3
2

答案 1 :(得分:2)

从Python 3.6开始,字典现在preserves the insertion order。因此,使用Python 3.6+,您可以通过将 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.pinchzoom.MainActivity"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/text_story_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" android:fontFamily="sans-serif-condensed" android:gravity="center_horizontal" android:text="text_story_name" android:textAllCaps="true" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/text_author_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="text_author_name" android:textAlignment="center" android:textSize="14sp" android:textStyle="bold|italic" /> <Space android:layout_width="match_parent" android:layout_height="5dp" android:background="#000000" /> <ImageView android:id="@+id/imageView2" android:layout_width="match_parent" android:layout_height="5dp" android:background="#000000" app:srcCompat="?attr/actionModeSplitBackground" /> <TextView android:id="@+id/text_body_story" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:padding="10dp" android:text="text_body_story" android:textColorHighlight="#ffee04" android:textSize="14sp" /> </LinearLayout> </ScrollView> </RelativeLayout> 转换为列表来获取索引。

dict_keys

作为另一个例子,下面演示了如何为一些感兴趣的键找到索引。

dictionary = {'test':{1,3}, 'test2':{2}, 'test3':{2,3}}

if 'test' in dictionary:
   print(list(dictionary).index('test'))

此输出将是

key_list = list(dictionary)
keys_of_interest = ['test2', 'test3']

for key in keys_of_interest:
    print('key: {}, index: {}'.format(key, key_list.index(key)))

答案 2 :(得分:1)

不幸的是,由于如何在python中构建字典,这样的事情是不可能的。这些数据结构本质上是无序的

要获得所需的功能,必须使用不同的数据结构,例如OrderedDict

答案 3 :(得分:1)

你可以建立一个索引:

internal

然后ind= {k:i for i,k in enumerate(dictionary.keys())} 将是2,O(1)访问时间。

当键被修复时,这是强大的。如果添加/删除键,则必须重建索引。

答案 4 :(得分:0)

在python 3.6或更高版本中,使用dicts保留插入顺序,那么您可以在一行中完成此操作,如果键不在词典中,则返回“ None”:

key_index = list(my_dictionary).index(the_key) if the_key in my_dictionary else None

答案 5 :(得分:0)

您可以将dict.keys()转换为列表,然后为列表建立索引

keys = list(dictionary.keys()
index = keys.index("test")

索引不在列表中的值将导致ValueError

keys.index("test5")
ValueError: "test5" is not in list