列表 字典

学习内容

  1. 列表

  2. 字典
    例子,学生信息管理,用列表,用列表嵌套,用字典

列表:python内置的一种数据类型。容器类,
列表中存数的数据是有顺序的,可以存放数字,字符串,对象

声明一个列表,列表中如果有多个元素,每个元素之间用,逗号隔开

list_1 = [1,'hello',True,3.1415926,'world']

1. 查询
用索引来访问list中每一个位置的元素,要记住索引是从0开始的
当索引超出范围时会报错
IndexError:list index out of range 列表索引越界

#支持负值操作,负值从后往前取值,最后一个元素的索引为-1
 pi = list_1[4]
 print pi
 print list_1
#pop()函数,从列表中取出数据,取出之后列表中没有了
 pi = list_1.pop(4)
 print pi
 print list_1

2. 添加

append表尾追加数据

   list_1.append('zhangsan')
   print list_1

insert指定索引,插入数据

   list_1.insert(2,False)
   print list_1

extend扩展列表,将另外一个列表中的数据全部添加到该列表

list_2 = [1,2,3]
list_1.extend(list_2)
print list_1

3. 修改
根据索引修改列表中的数据

list_1[4] = 3.14
print list_1

4. 删除

  • pop()函数,删除指定索引位置的元素
    若pop()不填写索引,默认取出最后一个元素

list_1.pop()
print list_1
  • del关键字,删除指定索引位置的元素

 del list_1[2]
 print list_1
  • remove()函数,移除指定元素,
    移除第一个匹配到的元素

 list_1.remove('zhangsan')
 print list_1

取出列表中所有数据

#for 循环,指定循环的次数,遍历列表
for x in range(0,len(list_1)):
#把x的值作为索引,从列表中取出数据
    content = list_1[x]
    print content

删除列表中所有的元素

while len(list_1):
    list_1.pop()
print list_1

字典
字典中存储的数据是无序的;
以key:value键值模式存储数据的,可以存储任何类型的数据;
key必须是唯一的;
字典中的key必须是不变的,一般推荐使用字符串/数字作为字典中的key;

#声明字典
dict_1 = {'name':'zhangsan','age':22,'phone':'110'}
print dict_1

基本操作

#若字典中有这个key,做修改的操作;若没有这个key,做添加的操作
#添加数据
dict_1['sex'] = 'male'
print dict_1
dict_1['adress'] = 'china'
#修改数据
dict_1['name'] = 'list'
print dict_1

# 查询数据
# 通过key取出key对应的值;;get()函数根据key取值,如果key不存在,可以指定获取一个默认值
sex = dict_1['sex']
name = dict_1.get('qwer','124566')
print name

# 删除字典中的数据
del dict_1['name']
print dict_1

# clear()函数,清空字典中的所有键值
# dict_1.clear()

介绍字典中几个重要的函数

# keys()获取字典中所有的key,返回的是一个列表
keys = dict_1.keys()
print keys

# values()获取字典中所有的值,返回的是一个列表
values = dict_1.values()
print values

# items() 获取字典中所有的key和value,返回的是一个列表中嵌套的小元组
[('name','jj'),('age','16'),('sex','male')]
items = dict_1.items()
print items


# has_key判断字典中是否拥有某个key,返回时布尔类型的数据
# 如果不存在这个key,返回False,如果存在返回True
is_have = dict_1.has_key('phone')
print is_have

小练习
学员信息管理

# coding:utf-8
'''
有一个存放所有学员信息的列表student_list
1.有五个功能:
     1.添加学员
        1.1输入一个学员的姓名,添加到所有学生列表中
     2.查询学员
        2.1输出所有学员的信息,学员的序号和学员的姓名
     3.修改学员
        3.1展示所有学员信息(序号,姓名)
        3.2选择学院的序号,修改姓名
     4.删除学员
        4.1展示学员信息(序号、姓名,根据选择的序号删除学员)
        4.2删除所有学员
     5.退出程序
'''
# 声明一个用来存放所有学员信息的列表student_list
student_list = []
while True:
    print '********学员管理系统V 1.0*********'
    print '1、********添加学员********'
    print '2、********查询学员********'
    print '3、********修改学员********'
    print '4、********删除学员********'
    print '0、********退出程序********'
    print '***************************'
    # 选择操作
    selc_num = input('请选择您的操作:')
    #判断选择的数字是否符合要求
    while selc_num not in range(0,5):
        selc_num = input('没有该选项,请重选:')
    #根据选择的数字,做出对应的操作
    if selc_num == 1:
        name = raw_input('请输入学员姓名:')
        student_list.append(name)
    elif selc_num == 2:
        for x in range (0,len(student_list)):
            name = student_list[x]
            print '序号',x, '姓名', name
    elif selc_num == 3:
        # 1.展示所有学员序号和姓名
        for x in range(0, len(student_list)):
            name = student_list[x]
            print '序号', x, '姓名', name
        # 2.选择要修改的序号
        index = input('请输入您要修改学员序号:')
        # 3.判断选择的数字是否符合要求
        while index not in range(0, len(student_list)):
            index = input('没有该序号,请重选:')
        # 4.字符串的拼接,格式化
        old_name = student_list[index]
        # %s 占位符
        name = raw_input('请输入您修改后的姓名(%s):'%old_name)
        # 5.修改
        student_list[index] = name
        print '修改成功!'
    elif selc_num == 4:
        print '1.根据序号删除学员信息'
        print '2.删除所有学员信息'
        sel_num = input('请输入您的选择:')
        while sel_num not in range(1, 3):
            sel_num = input('没有此选项,请重选:')
        if sel_num == 1:
            # 1.学员信息展示
            for x in range(0, len(student_list)):
                name = student_list[x]
                print '序号:%s 姓名:%s'%(x, name)
            index = input('请输入要删除的序号:')
            while index not in range(0, len(student_list)):
                index = input('没有该序号,请重选:')
            # 取出要删除的姓名
            old_name = student_list[index]
            rs = raw_input('您确定要删除:%s?y/n:'%old_name)
            if rs == 'y':
                del student_list[index]
        else:
            # 做删除数据的提醒
            rs = raw_input('您确定要清除所有数据?y/n:')
            if rs == 'y':
                while len(student_list):
                    student_list.pop()
    else:
        print '成功退出'
        break

嵌套列表

#coding:utf-8
student_list = []
while True:
    print '********学员管理系统V 2.0*********'
    print '1、********添加学员********'
    print '2、********查询学员********'
    print '3、********修改学员********'
    print '4、********删除学员********'
    print '0、********退出程序********'
    print '***************************'
# 选择操作
    selc_num = input('请选择您的操作:')
    # 判断选择的数字是否符合要求
    while selc_num not in range(0,5):
        selc_num = input('没有该选项,请重选:')
    # 根据选择的数字,做出对应的操作
    if selc_num == 1:
        # 1.输入学员信息
        name = raw_input('请输入学员姓名')
        age = raw_input('请输入学员年龄')
        phone = raw_input('请输入学员手机')
        # 2.组装一个完整信息的小列表
        person = [name, age, phone]
        # 3.将小列表添加到大列表中
        student_list.append(person)
    elif selc_num == 2:
        for x in range(0, len(student_list)):
            # 根据x的值,取出对应的小列表
            person = student_list[x]
            # 取出姓名,年龄,电话
            name = person[0]
            age = person[1]
            phone = person[2]
            print '序号:%s 姓名:%s 年龄:%s 电话:%s'%(x,name,age,phone)
    elif selc_num == 3:
        # 1.输出信息
        for x in range(0,len(student_list)):
            # 根据x的值,取出对应的小列表
            person = student_list[x]
            print '序号:%s 姓名:%s 年龄:%s 电话:%s'%(x,person[0],person[1],person[2])
        # 2.选择序号
        index = input('请输入要修改的序号:')
        while index not in range(0,len(student_list)):
            index = input('序号无效,请选择:')
        # 3.根据序号取出小列表
        person = student_list[index]
        new_name = raw_input('请输入修改后的名字(%s):'%person[0])
        new_age = raw_input('请输入修改后的年龄(%s):' % person[1])
        new_phone = raw_input('请输入修改后的电话(%s):' % person[2])
        # 4.修改数据
        person[0] = new_name
        person[1] = new_age
        person[2] = new_phone
        print '修改成功!'
    elif selc_num == 4:
        print '1.删除指定学员信息'
        print '2.删除所有学员信息'
        selc_num = input('请输入您的选择:')
        while selc_num not in range(1, 3):
            selc_num = input('没有此选项,请重选:')
        if selc_num == 1:
            # 1.学员信息展示
            for x in range(0, len(student_list)):
                # 根据x的值,取出对应的小列表
                person = student_list[x]
                print '序号:%s 姓名:%s 年龄:%s 电话:%s' % (x, person[0], person[1], person[2])
            # 2.输入要删除的序号
            index = input('请输入要删除的序号:')
            while index not in range(0, len(student_list)):
                index = input('没有该序号,请重选:')
            # 3.取出要删除的姓名
            old_name = student_list[index][0]
            rs = raw_input('您确定要删除:%s?y/n:' % old_name)
            if rs == 'y':
                del student_list[index]
        else:
            # 做删除数据的提醒
            rs = raw_input('您确定要清除所有数据?y/n:')
            if rs == 'y':
                while len(student_list):
                    student_list.pop()
    else:
        print '成功退出'
        break

练习用字典

<think>好的,我现在需要帮助用户解决他们的问题,也就是使用列表字典的方法生成500个不同的4位不重复数字验证码。用户之前已经得到了一个使用itertools.permutations和random.sample的解决方案,现在他们可能想了解另一种方法,特别是使用列表字典来实现同样的功能。 首先,我需要理解用户的需求。他们可能对之前的方法感兴趣,但想了解不同的实现方式,或者他们可能对itertools和random.sample不太熟悉,希望用更基础的Python结构来完成。使用列表字典的方法可能意味着不使用高级库,而是通过手动生成和处理数据。 接下来,我需要考虑如何用列表字典来生成这些验证码。列表通常用来存储元素的有序集合,而字典用于键值对。不过,生成验证码主要涉及生成唯一的数字组合,所以可能需要列表来存储所有可能的组合,然后用字典来检查重复,或者作为中间步骤处理数据。 首先,生成所有可能的4位不重复数字组合。四位数的每一位都必须是0-9之间的不同数字。由于允许前导零,例如“0123”是有效的,因此需要考虑所有排列。使用列表推导式或循环来生成这些组合是一个办法。例如,可以用四层嵌套循环,每一层代表一位数字,然后检查是否有重复的数字。但这种方法效率可能不高,特别是当位数增加时,时间复杂度会急剧上升。不过对于四位数字来说,可能还是可行的。 不过,手动生成所有排列可能比较麻烦,尤其是避免重复。这时候,可能需要使用集合来确保每个生成的数字是唯一的。例如,生成一个四位数字符串,其中每个字符都是唯一的数字。可以用随机方法生成,然后检查是否重复,但这样效率可能不高,特别是在生成大量唯一验证码时。 用户之前的方法已经预先生成了所有可能的组合,然后随机抽样,这样效率很高。现在要改用列表字典的方法,可能需要另一种思路。比如,使用字典来记录已生成的验证码,确保唯一性。或者,在生成过程中,将每个验证码作为字典的键,利用字典键的唯一性来去重。 不过,使用字典可能在这里并不是最高效的方式,因为列表已经足够存储这些验证码。也许用户的意思是使用更基础的Python结构,而不依赖itertools这样的库。因此,我需要考虑如何手动生成所有可能的排列,或者如何生成随机验证码并确保其唯一性,而不使用itertools.permutations。 可能的步骤是: 1. 生成所有可能的四位不重复数字组合,使用循环或递归,避免重复数字。 2. 将这些组合存储在一个列表中。 3. 使用random.sample从这个列表中抽取500个,或者用随机方法生成,同时检查是否重复。 但手动生成所有排列比较麻烦,可能需要自己实现排列生成算法,比如回溯算法。不过这可能超出了用户的预期,尤其是对于刚学习Python的人来说,这可能太复杂。 另一个方法是随机生成四位数字,并检查是否有重复数字,如果有效则加入列表,直到列表中有500个唯一的验证码。这种方法在需要生成的验证码数量远小于总的可能数量时效率较高,但这里总共有5040种可能(10P4=5040),而用户需要500个,这时候随机生成并检查重复可能可行,但存在一定的碰撞概率,导致生成速度变慢。不过对于500个来说,应该还是可以接受的。 不过用户之前的方法已经高效地预先生成了所有可能,然后抽样,而这里用户想用列表字典的方法。可能他们希望避免使用itertools,或者想了解不同的实现方式。 因此,可能的解决方案是: - 使用循环生成四位数字符串,确保每位数字不重复。 - 使用集合或字典来跟踪已经生成的验证码,确保唯一性。 - 当生成的验证码数量达到500时停止。 这里可以用字典来存储已生成的验证码,因为字典的键是唯一的,可以自动处理重复。不过实际上,用集合可能更合适,因为集合自动去重,而字典需要键值对。但用户提到使用列表字典,所以可能需要结合两者。 例如,生成一个空列表来存储验证码,然后循环生成随机四位数,检查是否在列表中已存在,如果不存在则添加。但这种方法在列表较大时检查存在性效率较低,因为每次都要遍历列表。而使用集合可以更快地检查存在性,因为集合的查找是O(1)时间复杂度。 不过用户可能希望用列表字典的方法,所以可能需要用字典来记录生成的验证码,例如将验证码作为字典的键,值可以是任意值,如True。这样检查是否存在只需要检查键是否在字典中,这样速度更快。 但最终需要的是列表形式的验证码,所以可以将字典的键转换为列表。不过这可能没有必要,直接用集合更简单。但为了符合用户的要求,可能需要使用字典。 不过用户的问题可能更倾向于使用列表来存储验证码,而字典可能用于其他用途,例如记录每个验证码的出现次数,或者用于快速查找是否存在。不过在这种情况下,可能不需要字典,除非有其他需求。 综合来看,用户可能希望用更基础的Python结构,如列表和循环,来生成这些验证码,而不是使用itertools的高级函数。因此,我需要提供一个不使用itertools的方法,而是通过随机生成四位数字符串,并确保每个字符串中的数字不重复,然后将这些字符串收集到列表中,直到有500个唯一的验证码。 具体的步骤可能如下: 1. 创建一个空列表来存储生成的验证码。 2. 循环生成随机的四位数字符串,直到列表中有500个唯一的验证码。 3. 在每次生成时,检查该字符串是否已经存在于列表中,如果不存在,则添加。 4. 为了提高效率,可以使用集合来辅助检查存在性,因为集合的查找速度更快。 但用户提到使用列表字典的方法,可能希望使用字典来记录生成的验证码。例如,可以将生成的验证码作为字典的键,这样自动保证唯一性,然后将键转换为列表。不过这可能不是必要的步骤,但为了符合用户的要求,可以这样处理。 不过直接使用集合可能更高效,但用户可能想了解如何结合列表字典来实现。例如,生成一个字典,键是验证码,值可以是某种状态,但可能这里字典的作用只是为了快速查找是否存在,而最终结果还是列表。 另一个可能的思路是,先生成所有可能的四位数组合,将它们存储在一个列表中,然后随机选择500个。但生成所有可能的组合可能需要手动实现排列,而不使用itertools.permutations,这可能需要编写排列生成的代码。 例如,使用四层嵌套循环,每一层代表一个数字,然后检查这四个数字是否各不相同。如果满足条件,则组合成字符串,加入列表。这种方法虽然可行,但对于四位数来说,需要10^4=10000次循环,但其中大部分会被过滤掉,只剩下5040个有效的组合。这种方法效率较低,但可行,尤其是对于四位数字来说,计算量不大。 不过,用户可能希望代码简洁,因此可能需要更高效的生成方式,但这里可能需要手动生成所有排列。 因此,可能的解决方案是: 方法一:手动生成所有可能的四位不重复数字组合,然后随机抽取500个。 方法二:随机生成四位不重复数字组合,直到收集到500个唯一的。 其中,方法一在用户之前的回答中已经用itertools实现,现在需要手动生成所有可能的组合,可能需要编写排列生成的代码,这可能比较复杂。 方法二则更简单,但生成随机验证码时可能会有重复,需要多次尝试,但最终能够收集到足够的数量。 考虑到用户现在想要使用列表字典的方法,可能更倾向于方法二,即随机生成,并使用字典或集合来去重。 因此,可能的代码结构如下: 使用循环,生成随机四位数,检查是否有重复数字,如果有效且未存在于列表中,则添加。 代码示例: ```python import random codes = [] generated = set() # 使用集合来快速检查存在性 while len(codes) < 500: # 生成4位数字字符 num = ''.join(random.sample('0123456789', 4)) if num not in generated: codes.append(num) generated.add(num) print("示例:", codes[:10]) print("总数验证:", len(codes) == 500 and len(set(codes)) == 500) ``` 这里使用了集合来快速检查是否已存在,避免了列表查找的低效。同时,使用random.sample来从'0123456789'中选择4个不重复的字符,直接生成一个四位数。这样生成的每个num都是四位不重复的数字字符串,因此不需要额外检查是否有重复数字,因为random.sample已经保证了这一点。 这种方法避免了使用itertools,完全依赖列表和集合(虽然用户提到字典,但集合更适合这里的情况),生成500个唯一的验证码。如果用户坚持要使用字典,可以将生成的验证码作为字典的键,例如: ```python codes_dict = {} while len(codes_dict) < 500: num = ''.join(random.sample('0123456789', 4)) codes_dict[num] = True # 值可以是任意内容 codes = list(codes_dict.keys()) ``` 这样,字典的键保证了唯一性,然后将键转换为列表。这可能更符合用户提到的“列表字典的方法”。 总结来说,用户可能需要一个不使用itertools的方法,而是通过随机生成和字典或集合来去重,从而生成500个唯一的四位数验证码。因此,回答需要解释如何用列表字典(或集合)来实现这一点,强调手动生成和去重的过程。</think>--- ### **使用列表字典生成500个不重复4位验证码** 以下方法通过**随机生成+去重逻辑**实现需求,避免依赖高级库: --- ### **代码实现** ```python import random codes = [] # 存储最终验证码的列表 generated = {} # 用字典键快速检查重复 while len(codes) < 500: # 生成4位不重复数字字符串(核心逻辑) digits = random.sample('0123456789', 4) code = ''.join(digits) # 通过字典键去重 if code not in generated: codes.append(code) generated[code] = True # 值可任意设置 # 验证结果 print("示例验证码:", codes[:10]) print("总数验证:", len(codes) == len(generated.keys())) ``` --- ### **关键逻辑解析** 1. **随机生成数字** `random.sample('0123456789', 4)` 直接从0-9中选取4个不重复数字,确保每位唯一性。 2. **字典去重原理** 利用字典键的唯一性:`if code not in generated` 实现$O(1)$时间复杂度查重,比列表遍历更高效。 3. **数据分离存储** - `codes`列表:按生成顺序保存验证码 - `generated`字典:仅用于快速查重 --- ### **性能对比** | 方法 | 时间复杂度 | 适合场景 | |--------------------|------------|--------------------| | 预生成全排列 | $O(n)$ | 需要极高频调用 | | 随机生成+字典去重 | $O(1)$查重 | 少量生成或动态生成 | --- ### **扩展场景** - **增加生成速度**:改用集合`generated = set()`,因为集合的哈希查找比字典键更快 - **控制内存占用**:若生成量接近5040种可能性上限(10P4=5040),需改用预生成全排列法 --- ### **执行示例** ``` 示例验证码: ['0615', '7802', '9524', '1306', '2485', '6953', '0237', '4175', '3068', '7319'] 总数验证: True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值