zoukankan      html  css  js  c++  java
  • python练习实例2--------构造数据类型

    有如下数据类型

    cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '沪B25041', '黑C34567']
    locations = {'': '上海', '': '北京', '': '黑龙江', '': '山东', '': '湖北', '': '湖南'}

    将其转化成数据类型

    {'上海': 1, '北京': 1, '黑龙江': 3, '山东': 2}

    思路:

    1. 新建一个空字典

    2. 循环列表cars,判断如果car对应的key是否在dic里面,如果在里面,按方式一处理;否则按方式二处理

    根据上述思路,可以写出如下代码:

    1 dic = dict()
    2 for car in cars:
    3     if locations[car[0]] not in dic:   # 如果car对应的key不在dic中,就设置初始值1
    4         dic[locations[car[0]]] = 1
    5     else:
    6         dic[locations[car[0]]] += 1    # 如果不在dic中,就自加1
    7 print(dic)

    上述代码还可以进行简化

    1 dic = dict()
    2 for car in cars:
    3     # 找key,找到就返回值,找不到设置初始值
    4     dic[locations[car[0]]] = dic.get(locations[car[0]], 0) + 1
    5 print(dic)

    上述代码可以抽象成一个模型:

    1. 找到操作的容器,通常是要得到的某个数据类型

    2. 找到要判断的元素,通常是列表的元素或字典的键

    3. 找到要遍历的容器,这个容器通常是要判断元素的母体

    3. 判断元素是否在容器里,如果在,执行操作一,通常是创建,设置初始值;如果不在,执行操作二,通常是根据元素对容器进行修改

    这个模型可以应用在很多问题中,下面来看另外一个例子:

    有如下列表
    list3 = [
        {"name": "Helen", "hobby": "抽烟"},
        {"name": "Helen", "hobby": "喝酒"},
        {"name": "Helen", "hobby": "烫头"},
        {"name": "Tony", "hobby": "喊麦"},
        {"name": "Tony", "hobby": "街舞"},
    ]
    要将其转化成下面形式的列表
    [{'name': 'Helen', 'hobby_list': ['抽烟', '喝酒', '烫头']}, {'name': 'Tony', 'hobby_list': ['喊麦', '街舞']}]

    利用上面总结的模型,可以很容易地写出如下代码

     1 # 1. 要操作的容器: list4
     2 # 2. 要判断的元素:"name"
     3 # 3. 要遍历的容器:list3
     4 # 3. 判断"name"是否在list4里面,在,把list3的hobby添加到list4的hobby_list里面;
     5 #    不在,在list4里创建一个字典:"name"就设置为name,创建hobby_list并添加name对应的hobby
     6 
     7 list4 = []
     8 for i in list3:
     9     for j in list4:
    10         if i["name"] == j["name"]:
    11             j["hobby_list"].append(i["hobby"])
    12             break
    13     else:
    14         list4.append({"name": i["name"], "hobby_list": [i["hobby"]]})
    15 print(list4)

    这里还有一种方法:构造字典,再生成列表,不过总的思路还是上面的模型

    1 dic = dict()        # 要操作的容器: dic
    2 for i in list3:    # 要遍历的容器list3
    3     if i["name"] not in dic:    # 要判断的元素i["name"]
    4         dic[i["name"]] = {"name": i["name"], "hobby_list": [i["hobby"]]}
    5     else:
    6         dic[i["name"]]["hobby_list"].append(i["hobby"])
    7 list4 = list(dic.values())
    8 print(list4)

    好了,到这里就结束了,以后往某个容器里添加元素时如果遇到无则创建,有则改变的情况就可以运用上述模型,绝对无往不利。

  • 相关阅读:
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(二)
    关于插件的好文章
    MemberInfo.GetCustomAttributes和MemberDescriptor.Attributes获取特性的不同
    新一代编程语言
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(一)
    发现一篇关于.NET 2.0中关于事务命名空间的好文章
    C# WinForm控件美化扩展系列之给TextBox加水印
    log4.net
    C# GDI+ 双缓冲
    C# WinForm控件美化扩展系列之ListBox
  • 原文地址:https://www.cnblogs.com/zzliu/p/10217052.html
Copyright © 2011-2022 走看看