精华内容
下载资源
问答
  • 在书上看到有的时候直接用变量的方式接收处理出来的列表,有的时候同样用变量的方式就会报错或者输出"calss: xxx" ,不明白什么时候才需要手动先建立一个列表,什么时候可以直接用变量方式接收
  • 今天复写PIE架构的代码,写完觉得没...我们常常遇到需要初始化一个空的二维列表来存储矩阵数据,如邻接矩阵等二维结构的数据。 那么一般来说我们常规的操作是这样的: nrows = 3 ncols = 4 array = [] for i i...

    今天复写PIE架构的代码,写完觉得没什么问题,结果怎么跑也跑不通。本来决定跑通就回寝睡觉,一路弄到十二点多,终于地毯式的debug终于找到了问题所在。反正现在精神状态良好,顺便水一篇博客。

    我们常常遇到需要初始化一个空的二维列表来存储矩阵数据,如邻接矩阵等二维结构的数据。

    那么一般来说我们常规的操作是这样的:

    nrows = 3
    ncols = 4
    
    array = []
    
    for i in range(nrows):
        array.append([])
        for i in range(ncols):
            array[-1].append(None)
    
    print(array)
    
    # 输出
    '''
    [[None, None, None, None], [None, None, None, None], [None, None, None, None]]
    '''

    为了省事你也可以这么写:

    nrows = 3
    ncols = 4
    
    array = [[None for i in range(ncols)] for j in range(nrows)]
    
    print(array)
    
    # 输出
    '''
    [[None, None, None, None], [None, None, None, None], [None, None, None, None]]
    '''

    可惜我这个人有强迫症,第二种写法还是太长了,超到IDE那条分割线的右边了,而我的强迫症迫使我必须把代码注释整齐地写在紧靠着IDE分割线的右侧,所以我就想肯定能有更“短”的写法。

    然后我决定这么写:

    nrows = 3
    ncols = 4
    
    array = [[None]*ncols]*nrows
    
    print(array)
    
    # 输出
    '''
    [[None, None, None, None], [None, None, None, None], [None, None, None, None]]
    '''

    简直完美,我的强迫症得到了极大的满足,我成功把代码注释写在紧靠着IDE分割线的右侧了。

    为了防止出错,我还特地验证了一下:

    nrows = 3
    ncols = 4
    
    array1 = [[None for i in range(ncols)] for j in range(nrows)]
    array2 = [[None]*ncols]*nrows
    
    print(array1==array2)
    
    
    # 输出
    '''
    True
    '''

    然后我就发现我怎么也跑不通代码了,花了近一个小时地毯式排查,终于发现了问题:

    nrows = 3
    ncols = 4
    
    array1 = [[None for i in range(ncols)] for j in range(nrows)]
    array2 = [[None]*ncols]*nrows
    
    array1[1][1] = 1
    array2[1][1] = 1
    
    print("这是array1:\n",array1)
    print("这是array2:\n",array2)
    
    # 输出
    '''
    这是array1:
     [[None, None, None, None], [None, 1, None, None], [None, None, None, None]]
    这是array2:
     [[None, 1, None, None], [None, 1, None, None], [None, 1, None, None]]
    '''
    

    如果是用两重循环新建的二维列表(array1),我去更新某个位置的元素时,发现更新很正常。但是如果是用两个乘号新建的二位列表(array2),我去更新某个位置的元素时,它会把这一列全部更新一遍。

    问题出现了总是很容易能解释清楚,本质上“*ncols”是无伤大雅的,因为只是复制了None。但是“*nrows”复制的是列表,这就有问题了,列表的复制是复制其地址,所以这三行一维列表本质上是指向地址相同的完全相同的三个列表。

    所以更新一个元素等价于同时更新三行同一位置的元素了。

    我之前还在想能这么简单的写还写两重循环不是太蠢了。果然是我太蠢了。

    为了省点事情,这么改写就没有问题了:

    nrows = 3
    ncols = 4
    
    array1 = [[None for i in range(ncols)] for j in range(nrows)]
    array2 = [[None]*ncols for i in range(nrows)]
    
    array1[1][1] = 1
    array2[1][1] = 1
    
    print("这是array1:\n",array1)
    print("这是array2:\n",array2)
    
    # 输出
    '''
    这是array1:
     [[None, None, None, None], [None, 1, None, None], [None, None, None, None]]
    这是array2:
     [[None, None, None, None], [None, 1, None, None], [None, None, None, None]]
    '''
    

    总之两个教训

    1. 发现问题时,先反思是不是自己有问题。
    2. 强迫症是真的害人。

    分享学习共同进步

     

     

     

    展开全文
  • python:关于空列表的用法错误

    千次阅读 2019-12-19 21:42:54
    list =[] #定义一个空列表 #想把新建的列表创建为8个元素且每个元素为0的列表 for i in range(8): list[i] = 0 结果输出报错: Traceback (most recent call last): File "<stdin>", line 2, in <module...

    本人在用到列表时,常常犯空列表的用法错误,如:

    list =[]     #定义一个空列表
    #想把新建的列表创建为8个元素且每个元素为0的列表
    for i in range(8):
       list[i] = 0
    

    结果输出报错:

    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    IndexError: list assignment index out of range
    

    报错说索引值超出了范围。这是肯定,因为我定义的列表list为空,是没有元素的,就算是list[0]也会报错。因此,想新建一个8个元素且每个元素为0的列表,应该按下面操作:

    list = []
    for i in range(8):
       list.append(0)
    print(list)
    

    输出为:

    list = [0,0,0,0,0,0,0,0]
    

    再另外拓展一下:
    list=[]和list=[0]的区别:
    以上两个操作都是定义了一个列表,但前者是一个空列表,后者是含有一个元素的列表。

    还要,想创建一个列表含有8个元素且均为0,其实有很多方法,如用numpy就很方便,如:

    numpy.zeros([1,8])
    

    但是,当你不确定建立的列表的维度时,一般先定义一个空列表,然后再用列表的子函数(append)添加元素。

    展开全文
  • 2.新建一个空列表 3.将半和与该列表的最后一枚元素依次比较。如果半和大,就把列表最后一个元素删除,添加到新列表中,half也减去这个元素的值;如果是最后一个元素大,就跳过该元素。无论哪一个大,length都要-1 4....

    将一个数组拆分成两个差值最小的数组

    整体思路是:

    1.把要被分割的已知列表sort()排序,并求出它的元素的和的一半,以及最后一个元素的索引length

    2.新建一个空列表

    3.将半和与该列表的最后一枚元素依次比较。如果半和大,就把列表最后一个元素删除,添加到新列表中,half也减去这个元素的值;如果是最后一个元素大,就跳过该元素。无论哪一个大,length都要-1

    4.自己给出需要排序的数组,进行测试

    import math as dou
    def doublesort(list):
        half = dou.fsum(list) / 2
        length = len(list) - 1
        list1 = []
        while(length>1):
            if(half>list[length]):
                list1.append(list[length])
                half=half-list[length]
                list.pop(length)
                length-=1
            else:
                length-=1
                continue
        return list,list1
    list=[9,10,14,18,21,32,43,8]
    list.sort()
    answer=doublesort(list)
    print(answer)
    print(sum(list),sum(answer[1]))
    

    测试数据1

    list=[9,10,14,18,21,32,43,8]
    在这里插入图片描述

    测试数据2

    list=[9,7,6,4,8,5,2,3,1,7]
    在这里插入图片描述

    测试数据3

    list=[160,512,488,356,159,444,520,521,233,333,390]
    在这里插入图片描述
    如图分组完毕,两组数据的差为170,可是列表中还存在着一枚159,将159从列表移到列表1,他们的差会更小。
    问题出现 ---------》两组和之差:1956-1786=170
    若是把 list 中 159移到 list1
    两组之差会变成 |(1956-159)-(1786+159)| = |1797-1945| = 148
    显然 上方代码错误

    可能刚刚还觉得一个这种排序,用那么大的数排完全没有意义嘛。但是也正是因为这次百位数尝试,发现了这个bug。

    再次修改:

    import math as dou
    def doublesort(list,length):
        half=sum(list)/2
        list1 = []
        list1_sum=0
        while(length>-1):
            d_value = sum(list) - sum(list1)
            if(half>=list[length]):
                list1_sum+=list[length]
                list1.append(list[length])
                half-=list[length]
                d_value=d_value-list[length]
                list.pop(length)
                length-=1
                continue
            else:
                length-=1
                continue
        d_value = sum(list) - sum(list1)
        if half < list[0] and d_value > list[0]:
            list1.append(list[0])
            list.pop(0)
        return list, list1
    list=[160,512,488,356,159,444,520,521,233,333,390]
    list.sort()
    length = len(list) - 1
    answer=doublesort(list,length)
    print(answer)
    print('第一个数组的和为{0},第二个数组的和为{1}'.format(sum(list),sum(answer[1])))
    

    结果如图
    在这里插入图片描述
    debug是真的有用呀…真不敢说自己用了两年codeblocks从来就没debug过。
    代码丑陋的 1 p,臃肿的不行,已经被批评过了。
    至于是否还存在bug 咱也不知道了…

    展开全文
  • python列表操作

    2018-11-22 14:44:00
    列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。如 list = ['a','b',2,5,'1'] 1、新建列表 stus = [] #创建空列表 stus1 = list() #创建空列表 ...

    列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。列表的数据项不需要具有相同的类型。如    list = ['a','b',2,5,'1']   

    1、新建列表

    stus = []   #创建空列表
    stus1 = list()   #创建空列表
    print(stus)
    print(stus1)
    stus = ['范冰冰','维达','SOON','上述'] #创建非空列表
    print(stus)

    2、列表增加元素

    stus = ['范冰冰','维达','SOON','上述']
    stus.append('莉莉') #在列表末尾增加一个元素
    stus.insert(2,'Lucy') #insert可以指定元素插入的位置
    print(stus)

    3、列表长度

    stus = ['范冰冰','维达','SOON','上述']
    
    print(len(stus))

    4、修改列表元素

    stus = ['范冰冰','维达','SOON','上述']
    
    stus[3] = '哈哈'  #直接找到下标,对元素赋值
    print(stus)

    5、列表删除元素

    stus = ['范冰冰','维达','SOON','上述']
    stus.append('莉莉') #在列表末尾增加一个元素
    stus.insert(2,'Lucy') #insert可以指定插入的位置
    print(stus)
    print(len(stus))
    stus[3] = '哈哈'
    print(stus)
    stus.pop()  #默认删除最后一个元素
    stus.pop(2)  #删除下标为2的元素
    stus.remove('范冰冰')  #传入元素值,直接删除元素。 remove时必须传值
    del stus[1]  #删除指定下标的元素
    print(stus)
    stus.clear()  #清空列表
    print(stus)

    stus.pop()、stus.remove()、 del stus[] 删除不存在的值时都会报错。

    6、查询元素,查询元素下标

    stus = ['范冰冰','维达','SOON','上述']
    print(stus[2]) #查找指定下标的元素
    print(stus.count('')) #查找指定元素出现的次数,注意一个列表元素按照一个整体处理,该值返回0
    print(stus.index('维达'))  #按照元素名称查询元素下标

    注意,按照元素查询下标的时候,若列表中有多个该元素,则返回第一次出现的该元素的下标。如果元素不存在,则报错

    7、列表反转

    stus = ['范冰冰','维达','SOON','上述']
    stus1 =[1,3,6,4,2,6,8,3]
    stus.reverse()#直接列表反转
    stus2 = list(reversed(stus1))#使用list函数进行反转
    print(stus2)  
    print(stus)
    #注意,反转的时候不能直接print(stus.reverse())

    另外,按照列表切片也可以进行反转。

    print(stus[::-1])   

    8、列表排序

    stus1 =[1,3,6,4,2,6,8,3]
    stus1.sort()#直接对列表进行排序
    stus2 = list(sorted(stus1))  #按照list函数进行排序
    print(stus2)

    倒序排列

    stus1 =[1,3,6,4,2,6,8,3]
    stus1.sort(reverse=True) #倒序排列
    stus2 = list(sorted(stus1,reverse=True))  #按照list函数进行倒序排序
    print(stus1)
    print(stus2)
    #注意,排序的时候不能直接print(stus1.sort()

    备注:排序默认按照正序排列

    9、两个列表相连

    stus = ['范冰冰','维达','SOON','上述']
    stus1 =[1,3,6,4,2,6,8,3]
    stus1.extend(stus)  #两个列表相连,把一个list中的元素添加到另外一个list中
    print(stus1)
    #注意写法,不能直接print(stu1.extend(stus))

    也可以连接自己,把自己输出两遍

    10、列表操作符

    列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。

    Python 表达式结果描述
    len([1, 2, 3]) 3 长度
    [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合
    ['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复
    3 in [1, 2, 3] True 元素是否存在于列表中
    for x in [1, 2, 3]: print(x, end=" ") 1 2 3 迭代

     

    11、列表截取--切片

    切片是list取值的一种方式。切片取值是顾头不顾尾,取到尾巴的时候要加1,前面一个下标,后面一个下标,中间是冒号,下标从0开始时,前面可以不写。

    stus = ['范冰冰','维达','SOON','上述']
    print(stus[2])
    print(stus[-2])
    print(stus[-2:])
    print(stus[1:2])
    print(stus[1:4:2])#步长为2时,中间隔一个
    print(stus[::])  #复制一个新列表
    print(stus[::-1]) #将原来的list倒序输出
    • print(stu0[2:5])
    • print(stu0[:5])代表从最前面开始取值
    • print(str0[4:10]),取后面的值,要是取到末尾,那么后面的下标可以不用写 print(str0[4:])
    • 什么下标都不写的时候,相当于是复制一个新的List,如 new_stu0=stu0[:]
    • New_stu = stu[0],也是复制一个,但是在内存中的占用不一样
    • print(stu0[0:10:1]) ,再加一个冒号代表步长,代表隔一个或者隔几个取一个
    • print(stu0[0:10:2]),2的时候是跳过一个元素取一个值,
    • print(stu0[::-1])步长为负数时,从右往左取值,步长是正数时,是从左往右取

    12、列表循环

    stus = ['杨静', '王志华', '王银梅', '乔美玲',
            '段鑫琪', '王立文', '赵燕',
            '杨华', '周永波', '杨静']
    for index,stu in enumerate(stus,1):#同时取到下标和值
        print("%s ==> %s"%(index,stu))

    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。参数sequence为需要循环的序列,start为下标起始位置。

    普通的list循环:可与上面对比

    stus = ['杨静', '王志华', '王银梅', '乔美玲',
            '段鑫琪', '王立文', '赵燕',
            '杨华', '周永波', '杨静']
    
    i = 0
    for ele in stus:
        print(i,stus[i])
        i = i +1

    如果直接循环一个list,那么每次取的就是list里面的每一个元素

    13、多维数组

    stu0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    stu1 = [1,2,3,4, ['a','b','c'], ['',''] ]
    stu1[5][0] = '哈哈'
    print(stu1)
    stu2 = [1,2,3,4,['a',['','',''],'b','c', ] ]#3维数组
    stu2[4][1].insert(0,'呵呵呵')
    print(stu2)

     

    转载于:https://www.cnblogs.com/blueteer/p/10000223.html

    展开全文
  • python数据结构之列表

    2020-08-29 11:20:15
    新建一个空列表 null_list = [] 建立一个int类型的列表 int_list = [1,2,3] 建立一个str类型的列表 str_list = ["a","b","c"] 建立一个int+str类型的列表 int_str_list = [1,2,"a","b"] 列表的复制 int_list = ...
  • # 新建一个空列表 list = [] # 为其赋值 list.append('a') 添加列表元素 方法一: # 在列表末尾添加单个元素 list = ['a','b','c','d'] list.append("e") 方法二: # 在列表末尾添加多个元素 list =
  • python 反转列表

    2019-09-27 17:56:10
    翻转一个链表 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个链表1->2->3->null,这个翻转后的...1. 新建空节点:None2. 1->None3. 2->1->None4. 3->2->1->...
  • Python-列表转字符串

    2020-12-21 11:55:00
    问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是: ... li=list() #新建一个空列表 n=i for j in range(0,5): li.append(str(n%2)) #转为字符串的形式存入
  • # 新建一个空列表 array0 = [] array1 = list() # 新建列表 array2 = [1, 2, 3, 4, 5] array3 = list("Hello") array4 = ["Hello", 1, 1.2, [0], {"key": "value"}, {1, 2, 3}, (1, 2, 3)] # 列表推导式 array5 = ...
  • python实现列表去重的方法

    千次阅读 2019-06-29 21:14:51
    对列表alist=[1,2,2,4,4,6,7],实现去除重复元素。 方法一:首先考虑使用set集合,因为使用集合可以去除重复元素...方法二:考虑先对列表进行遍历,然后新建一个空列表,对原有列表进行遍历,判断该元素是否在新的...
  • 什么是list ...list1 = [] # 创建一个空列表 list2 = ['ab',12,15.64,15+9j,True] # 创建一个列表并填充初始数据 当新建一个list并用已有list对其初始化时,有两种情况 new_list = old_list # 1 赋值 n...
  • 提取列表中的元素之后,放在其他的数据中,对其处理的时候原来的列表数据也会发生改变 问题 提取列表中的元素,放在其他列表中,在新的列表中处理它的时候,原来列表中的元素也会...#新建一个空列表 >>> ...
  • python 的列表去重在许多程序中都有使用,一般如将list1中的重复项去除的方法是新建一个空列表list2然后用if not in 语句去重如:list1=['hello','world','hello',3.14,3] list2=[] for i in list1: if not i in ...
  • # 建立一个空列表的两种写法 l = [] l = [] = list() # 新建一个含有元素的列表 l = [1,2,3] # 访问元素,输入负数倒叙访问,正序底标从0开始,倒叙从-1开始 print(l[0]) # 输出 1 print(l[2]) # 输出 3 print(l...
  • 列表可以是普通列表、混合列表,也可以是空列表,列表中可以添加列表。列表内容可以是整数,可以是浮点数,也可以是字符串。元素的位置是从“0”开始的。 2.新建列表: 新建列表 变量 = [] 3.len() 函数可以...
  • Python 序列

    2020-07-14 23:00:05
    参数为空生成一个空列表。参数不为空:先新建一个列表,每一次循环通过索引得到元素插入到列表中,迭代完成,循环结束。 (迭代:重复反馈过程的活动,其目的是接近并达到所需的目标的结果,目前相当于for循环) &...
  • 1.列表,元组&字符串 新建列表&元组 member=[‘aaa’,‘bbb’,‘ccc’,‘ddd’,1,2,3] ...注意:元组创建时若只有一个元素例如(1),则其为int类型,应该改为(1,);元组为() 列表添加元素 ...
  • 2.3 数据结构——列表list 2.3.1 列表的概念 列表(list)是用来存储组有序数据元素的数据结构,元素之间用逗号分隔。列表中的数据元素 应该包括在方...新建空列表: null_list = [ ] 建立int类型列表: int_list =
  • """初学python入门 学生精简信息 列表增删改查 1.通过input函数设置保存数据到card_list列表 ...card_list = [] # 设置一个空列表,用来存放学生的信息,包含姓名,学号,电话 # 面板信息提醒功能 .
  • python面向对象

    2020-12-29 13:26:55
    1、列表的概念 列表(list)是用来存储一组有序数据元素的数据结构,元素之间用都...■新建一个空列表,如下图: ■建立一个int类型列表 当方括号中的数据元素全部为int类型时,这个列表就是int类型的列表 ■建立一个st
  • 首先新建空列表,然后从大到小添加K个不同的数字,然后再向列表添加时要更新列表,比列表最后一个值大的不添加,比列表最后一个值小的要将最后一个值删除并将此数添加到合适的位置。 3.python实现: # -*- coding...
  • python 数据结构

    2020-04-18 15:12:48
    数据结构是指以某种方式组合起来的数据元素集合,pyhton 最基本的数据结构为序列,序列的每个元素都有编号,即其位置或索引,其中第一个...创建一个名为 x 的空列表 x = [] 创建一个包含 1-5 (整数型) 的名称为 x ...
  • 通过Power BI Python 在Power BI Desktop中使用Python导入数据这篇文章,我们... 首先我们进入Power Query管理器界面,通过新建一个空查询,并建立一个1到100的列表,再将其转换为表 随后我们依次点击“转换/运行P...
  • python编写程序

    2021-05-17 21:12:00
    编写程序。新建一个空列表,向其中添加12名同学的成绩(百分制)。 删除不及格的成绩,最后从高到低显示成绩,并显示成绩的数量,判断80分排第几。  </p>
  • Python set集合

    2016-02-05 15:17:00
    /usr/bin/env python3#set 是一个无序且不重复的元素集合#访问速度快#天生解决重复问题'''#在对象中增加一个元素#传值是列表或字符串s1 = set() #新建一个空的对象s1.add('andy') #在对象中增加一个元素print(s1)s1....
  • 通过遍历题目给定的非空数组,记录首次出现的数,存入一个新建空列表a内;已出现的数字计入另一个新建空列表b内(重复的数)。然后遍历题目给定的非空数组是非在b内,不在的就是只出现过一次的数。 时间复杂度:...
  • 一个空的文件夹下新建了12个空文件夹,留作日后存放文件。这12个文件夹我想命名为1月到12月的英文单词。 思路: a 定位到当前文件夹 b 新建列表列表内包含想要重命名的文件名字符串 c 遍历列表,将...
  • Python编程题

    2020-09-24 15:57:46
    (2)新建一个空列表 (3)把原列表中的值从最后1个复制给新建列表,直到第一个元素被复制完 list1 = [0,1,1,0,1,1,0,1,1,1,0,0] list1.sort() list_len = len(list1) list2 =[] i = 0 j = list_len-1 for i in ...
  • 新建一个空列表,赋值时出现错误提示:IndexError: list index out of range 问题原因:Python和C的语法不同,对空列表不能直接进行指定位置的赋值。 问题解决:使用append函数进行赋值 举例:编写一个函数返回...

空空如也

空空如也

1 2 3 4 5
收藏数 97
精华内容 38
关键字:

python新建一个空列表

python 订阅