如何高效地访问字典元素------The dic.items()[index] is deprecated

版权声明:未经本人许可,不得用于商业用途及传统媒体。转载请注明出处! https://blog.csdn.net/qikaihuting/article/details/82315011
#coding=utf-8
from __future__ import absolute_import,division,print_function
"""
访问字典元素的快速方式,当进行筛选性遍历访问时,即根据满足条件的索引去访问字典,建议将其转为列表,默认是
将键值存为列表元素;根据列表元素来访问对应的键值,效率高很多.
当进行顺序访问时,即采用for key,val in dic.items()即可。
"""
import os
import csv
import time
import numpy as np
import random
from collections import OrderedDict

def is_pair(angles1, angles2,threshold = 30):
    # input the the list angles data
    P = abs(angles1[0]-angles2[0])
    Y = abs(angles1[1]-angles2[1])
    R = abs(angles1[2]-angles2[2])
    if P > threshold or Y > threshold or R > threshold:
        return True
    else:
        return False

def get_pairs(All_train_list):
    """
    args: all_train_data_path_list
    整个字典元素个数len(dic.keys())=15677,这里选取前5000个元素进行遍历,
    #完成字典的创建
    """
    f = open(All_train_list,'r')
    dic = OrderedDict()
    for item in f.readlines()[:5000]:
        name = item.split( )[0]
        angles = [float(item) for item in item.split( )[-3:]]
        dic[name] = angles
    f.close()
    #确定pair样本的策略
    pair_name = set()
    list_dic = list(set(dic))
    #外循环索引列表
    external_index = [i-1 for i in range(2,len(list_dic)) if i%4==0]
    base = random.randint(1,len(list_dic)//2)
    start = time.time()
    step = 1
    for index_1 in external_index:
        step +=1
        sta = time.time()
        #dic.items()访问,其相当于两个步骤,先将整个字典转为列表,再取值,效率低
        ##key1,value1 = dic.items()[index_1]
        #根据列表元素访问,直接根据键,取值。
        key1,value1 = list_dic[index_1],dic[list_dic[index_1]]
        # random list contain 1000 elements --内循环的索引列表
        permutation = random.sample(range(base,len(list_dic)),500)
        for index_2 in permutation:
            ##key1,value1 = dic.items()[index_2]
            key2, value2 = list_dic[index_2],dic[list_dic[index_2]]
            #判断是否满足pair要求,满足则存入集合pair_name中
            if (((key1, key2)) in pair_name) or (((key2, key1)) in pair_name):
                continue
            if is_pair(value1,value2):
                #print('{}---{}'.format(key1 ,key2))
                pair_name.add((key1, key2))
        end1 = time.time()
        print("the step {} cost is {}".format(step,end1-sta))
    #可以测试一下两种不同方式的时间效率,相差很大。
    end = time.time()
    print('the nums of pairs samples is {},costs {}'.format(len(pair_name),end-start))

if __name__=='__main__':
    get_pairs('./All_Train_Lists.txt')

猜你喜欢

转载自blog.csdn.net/qikaihuting/article/details/82315011