• python的数据结构整理002列表,字典,集合,怎么选?


    列表,字典,集合,怎么选?

    假设现在有一个电商后台存了产品的ID和价格。有一个需求是给定ID如何找出对应价格?

    如果使用列表来存储数据结构,并进行查找,那么代码如下。

    # products list version
    def FindProductPrice(products,product_id):
        for id, price in products:
            if id == product_id:
                return price
        return none
    
    products = [(10001001,100),(10001002,120),(10001003,130)]
    print("The price of product 10001003 is {}.".format(FindProductPrice(products,10001003)))
    

    如果使用字典来存储数据结构,那么查找代码如下。

    # products dict version
    products = {10001001:100,10001002:120,10001003:130}
    print("The price of product 10001003 is {}.".format(products[10001003]))
    

    当需求变为找出商品有多少种不同的价格的时候怎么办?

    列表版本。

    # list version
    def FindUniquePriceUsingList(products):
        UniquePriceList = []
        for _, price in products:
            if price not in UniquePriceList:
                UniquePriceList.append(price)
        return len(UniquePriceList)
    products = [(10001001,100),(10001002,120),(10001003,130)]
    print("Number of unique price is {}.".format(FindUniquePriceUsingList(products)))
    

    集合版本。

    # set version
    def FindUniquePriceUsingSet(products):
        UniquePriceSet = set()
        for _, price in products:
            UniquePriceSet.add(price)
        return len(UniquePriceSet)
    products = [(10001001,100),(10001002,120),(10001003,130)]
    print("Number of unique price is {}.".format(FindUniquePriceUsingSet(products)))
    

    列表版本和集合版本的性能比较,可以明显的看到集合版本节省了大量的时间。

    import time
    id = [x for x in range(0, 100000)]
    price = [x for x in range(200000, 300000)]
    products = list(zip(id, price))
    
    # list version
    StartUsingListTime = time.perf_counter()
    FindUniquePriceUsingList(products)
    EndUsingListTime = time.perf_counter()
    print("time elapse using list: {}".format(EndUsingListTime - StartUsingListTime))
    
    # set version
    StartUsingSetTime = time.perf_counter()
    FindUniquePriceUsingSet(products)
    EndUsingSetTime = time.perf_counter()
    print("time elapse using set: {}".format(EndUsingSetTime - StartUsingSetTime ))
    
    
    time elapse using list: 31.758130708999943
    time elapse using set: 0.004608834000009665
    
  • 相关阅读:
    纯C分割 字符串 devC++版本 vs各种奇怪的问题,
    C的字符串操作 split
    MyArray框架搭建与实现
    三目运算符(C++)
    ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    sqlServer not in 分页
    web 移动端开发手机查看效果
    webpack 安装babel处理ES6语法
    webpack 的环境搭建
    web 服务器添加数据到 SQL server
  • 原文地址:https://www.cnblogs.com/jason007/p/15717056.html
Copyright © 2020-2023  润新知