Python中的 List

关于List:

      • 最最最基本操作
      • 其他操作上的问题
        • 一、如何判断 list 重复
        • 二、根据 list 里面的每一个 list 的第一个元素排序
        • 三、 一个 list 给另一个 list 赋值
        • 四、list 与 nparray
        • 五、二维列表按列取元素
      • 报错汇总
        • IndexError:list assignment Index out of range
        • ValueError: invalid literal for int() with base 10: "6960"
        • TypeError: unhashable type: 'list'
      • List的效率问题(处理大数据时尤为重要)

最最最基本操作

# 创建
L = []
L = ['a', 'b', 'c']
L = ['apple', 123, True]
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
L = list(range(5))
# 取长度
len(L)
# 插入
L.insert(2, 'd')  # 在指定位置插入元素
L.append('pear')  # 在尾部追加元素
# 删除
L.pop()       # 删除尾部元素
L.pop(1)      # 删除指定位置元素
L.remove('a') # 删除指定元素
# 元素替换
L[0] = 'banana'
# 求元素出现次数
L.count('apple')
# 取元素索引
L.index('apple')
# 元素排序
L.sort() 
L.sort(reverse = True)
# List切片操作(正数--索引,负数--位)
a = [1,2,3,4,5,6]
print(a[2:4])   # [3, 4] 左闭右开区间 从索引2到索引4
print(a[-4:-2]) # [3, 4] 左闭右开区间 从倒数第4位到倒数第3位
print(a[:4])    # [1, 2, 3, 4] 默认从索引0开始开始
print(a[4:])    # [5, 6] 默认到最大索引结束
print(a[::1])   # [1, 2, 3, 4, 5, 6] 从索引0开始每1位输出一次
print(a[::2])   # [1, 3, 5] 从索引0开始每2位输出一次
print(a[::-1])  # [6, 5, 4, 3, 2, 1] 从最后一位开始,倒序每1位输出一次
print(a[::-2])  # [6, 4, 2] 从最后一位开始,倒序每2位输出一次

其他操作上的问题

一、如何判断 list 重复

l1 = [1,2,3]
l2 = [3,2,1]
print(l1 == l2)  # False:l1 和 l2 逐个元素进行比较,相同位置元素全都相同认为 list 相同
print(set(l1) == set(l2))   # True:l1 和 l2 含有的元素相同即认为 list 相同

二、根据 list 里面的每一个 list 的第一个元素排序

arr_new = [ [2,3,4] , [3,4,5], [1,2,3] ]
sort_arr = [value for index, value in sorted(enumerate(arr_new), key=lambda arr_new: arr_new[1])]# sort_arr = [ [1,2,3] , 
#             [2,3,4], 
#             [3,4,5] ]

三、 一个 list 给另一个 list 赋值

方式一: 直接用 = 赋值,实际是把对象 a 的地址给了 b(即 a 和 b 指向内存中相同的位置),所以对 a 做修改,b 也表现为被修改了。

 a = [1, 2, 3]b = a
# b = [1, 2, 3]a[0] = 0
# b = [0, 2, 3]

方式二:使用切片赋值,实际上为 b 重新开辟了一块内存区域,用 a 的每一个元素的值来给 b 赋值,由于a 、b 在内存中的指向不同,所以修改 a 对 b 并没有影响

b = a[:]
a[0] = 0
b = [1, 2, 3]

四、list 与 nparray

术语:

  • list 是列表,列表的元素是列表可以称为多层列表,list最多只有一个维度,是python内置对象
  • nparray 是数组,真正的数组,可以有多个维度,是numpy的数据类型

1、关于list 转 nparray
真是一部血泪史!!!!(在此感谢高中同学GL的帮助)

list1 = [[1, 2, 3], [4, 5, 6]]
nparr1 = np.array(list1)
# 结果 nparr1 变成了二维数组,很棒对不对!!!
[[1 2 3][4 5 6]]# 但是我当时就转不过来,才发现是list的问题
list2 = [[1, 2, 3], [4, 5]]
nparr2 = np.array(list2)
# 结果 nparr2 是这样子的:
[list([1, 2, 3]) list([4, 5])]

数据处理的时候忽略了一种情况,导致这个 bug,其实这个bug又会引起别的地方的 bug,使用 debug 的方式一步步向上找,才找到问题得根源,debug 大法好!
也说明了在写程序的时候,写一段就 test 一段会比较好,一不小心留下的小问题,到最后需要很大力气回来找原因。

2、nparray 转 list

b = np.array([[1, 2, 3], [4, 5, 6]])
a = b.tolist()
# 结果 b:
[[1 2 3][4 5 6]]
# 结果 a:
[[1, 2, 3], [4, 5, 6]]

3、展开

# 1、二维数组转化为一维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
b = b.reshape((1, -1))  
# 结果:
[[1 2 3 4 5 6]]# 2、多层 list 展平为一层
a = [[1, 2, 3], [4, 5, 6]]
a_flat = [item for sublist in a for item in sublist]
# 结果
[1 2 3 4 5 6]
# 更多展开方法见:https://www.cnblogs.com/wushaogui/p/9241931.html

五、二维列表按列取元素

直接切片是不行的:

a=[[1,2,3], [4,5,6]]
print(a[:, 0])   # 尝试用数组的方法读取一列失败

我们可以直接构造:

b = [i[0] for i in a]   # 从a中的每一行取第一个元素。
print(b)                # [1, 4]

报错汇总

IndexError:list assignment Index out of range

情况一:数组索引越界
情况二:数组未初始化
报错代码如下:

temp = []
for line in friend_arr:if (line[0] in u_dict) and (line[1] in u_dict):temp[0] = u_dict.get(line[0])temp[1] = u_dict.get(line[1])friend_arr_new.append(temp)

改为 temp = [0, 0] 注意后面是根据索引赋值,而不是根据append添加值,所以初始化时不能为空。
其实可以不用临时变量,改为:

for line in friend_arr:if (line[0] in u_dict) and (line[1] in u_dict):friend_arr_new.append([u_dict.get(line[0]), u_dict.get(line[1])])

ValueError: invalid literal for int() with base 10: “6960”

错误含义:应该放一个 int 类型的数据,我放了一个无效的字符 “6960”
去看一下报错那行的变量是下面这样的,把string放了进去,找到赋值的地方,去掉了str(),

[23,56,78,'70,'70','70']

网上也有人说可以这样操作,不过我这里是不需要:

import re
# 用了int(string)语句的地方改为下面的表达,即去掉所有非数字的字符。
int(re.sub("\D","",string))

TypeError: unhashable type: ‘list’

1、原因:set的元素必须是可以hash的元素(hashable items)

  • int、float、str、tuple:是可以哈希的
  • list、set、dict:是不可哈希的
s = {1, 2}  # 使用元素直接创建set集合(此时元素为int类型)
print(s)  
s1 = set([1, 2])  # 使用list中的元素创建set集合(此时list中的元素为int类型)
print(s1) 

结果:
{1, 2}
{1, 2}

s2 = {[1, 2], [1, 2], [1, 2, 3]}  # 使用元素直接创建set集合(此时元素为list类型)
print(s2)s3 = set([[1, 2], [1, 2], [1, 2, 3]])  # 使用list中的元素创建set集合(此时list中的元素为list类型)
print(s3)

结果:
TypeError: unhashable type: ‘list’
TypeError: unhashable type: ‘list’

2、一般使用 set 里面放 list 的目的是想获得不重复的 list 的集合

# 换个思路:list中元素都排序后就可以识别重复
list_temp.sort()
if list_temp not in list_total:list_total.append(list_temp)

List的效率问题(处理大数据时尤为重要)

1、检查元素
与字典、集合相比,检查列表中元素是否存在某个值是非常缓慢的,这是因为Python在列表中进行了线性逐个扫描,而在字典和集合中Python是同时检查所有元素的(基于哈希表)
2、连接列表
x = [‘a’, ‘b’, ‘c’]
y = [‘apple’, 123, True]

方式一:x+y
方式二:x.extend(y)

方式一是一种相对高代价的操作,因为连接过程中创建了新列表,并且需要复制对象。
方式二是一种效率更高的操作,尤其是在构建大型列表的时候。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty的实现原理、特点与优势、以及适用场景

高并发编程系列 高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型 高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 高并发编程系列:CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列&…

拒绝无脑吹!从ACL20看预训练缺陷

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 舒意恒、兔子酱以 BERT 为代表作的预训练模型的研究热度一直很高,到 0202 年了,预训练的研究依旧层出不穷,而且 ACL 2020 Best Paper 荣誉提名也选择了这一主题的研究…

论文浅尝 | AMUSE: 基于 RDF 数据的多语言问答语义解析方法

来源:ISWC 2017链接:https://link.springer.com/content/pdf/10.1007%2F978-3-319-68288-4.pdf本文主要关注基于RDF数据的多语言问答任务中,对不同语言问句的语义分析工作。作者提出一种基于DUDES(Dependency-based Underspecified Discourse…

网易2018

网易2018数据分析(20道单选3道问答) 好评率是会员对平台评价的重要指标。现在需要统计2018年1月1日到2018年1月31日,用户’小明’提交的母婴类目"花王"品牌的好评率(好评率“好评”评价量/总评价量): 用户评…

贪心应用--汽车加油次数问题

文章目录1. 问题描述2. 解题思路3. 实现代码4. 测试结果1. 问题描述 已知汽车的油箱额定里程,到目的地的路途中各加油站距起点的距离,求如何加油,让加油的次数最少。 2. 解题思路 每次出发前检查下一个加油站有多远,车子能不能…

Pandas中的元素替换

# 序列中的元素替换 ser pd.Series([0, 1, 2, 3, 4, 5]) print(ser.replace(0, 6)) # 单个元素替换 print(ser.replace([0, 1, 2, 3, 4, 5], [5, 4, 3, 2, 1, 0])) # 列表替换 print(ser.replace({1: 11, 2: 22})) # 字典替换# DataFram中的元素替换 df pd.DataFrame({&qu…

最全多线程经典面试题和答案

Java实现线程有哪几种方式? 1、继承Thread类实现多线程2、实现Runnable接口方式实现多线程3、使用ExecutorService、Callable、Future实现有返回结果的多线程 多线程同步有哪几种方法? Synchronized关键字,Lock锁实现,分布式锁等…

论文浅尝 | Aligning Knowledge Base and Document Embedding Models

本文是我们于苏黎世大学合作的关注与知识图谱和文本对齐的论文,发表于ISWC2018.文本和知识图谱都包含了丰富的信息, 其中知识图谱用结构化的三元组表示信息,文本用自由文本形式表示信息,信息表示的差异给知识图谱和文本融合对齐造成了困难&am…

学会提问的BERT:端到端地从篇章中构建问答对

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 苏剑林机器阅读理解任务,相比不少读者都有所了解了,简单来说就是从给定篇章中寻找给定问题的答案,即“篇章 问题 → 答案”这样的流程,笔者之前也写过一些…

leetcode--数组(Medium2)

2019.08.09 39.组合总数 基本思想:回溯实现: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:candidates.sort()n len(candidates)res []def helper(i, tmp_sum, tmp):if tmp_sum > target or i n:return …

玩转算法面试-第四章查找值之leetcod相关笔记

查找问题 4-1,2 两类查找问题 1 查找有无:set 2 查找对应关系:map 常见的四种操作: insert, find, erase, change(map) 例题 leetcode 349 :给定两个数组,…

分治算法(Divide Conquer)

文章目录1. 分治算法思想2. 应用举例2.1 逆序度3. 分治思想处理海量数据1. 分治算法思想 分治算法的核心思想就是,分而治之,将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并…

史上最全Java多线程面试60题,含答案大赠送!

【BAT必考系列!多线程60题】 多线程有什么用? 线程和进程的区别是什么? ava实现线程有哪几种方式? 启动线程方法start()和run()有什么区别? 怎么终止一个线程&#…

论文浅尝 | Interaction Embeddings for Prediction and Explanation

本文是我们与苏黎世大学合作的工作,将发表于WSDM2019,这篇工作在知识图谱的表示学习中考虑了实体和关系的交叉交互,并且从预测准确性和可解释性两个方面评估了表示学习结果的好坏。给定知识图谱和一个要预测的三元组的头实体和关系&#xff0…

商汤科技-数据运维工程师-提前批笔试题目汇总

2019年8月19日 问答题1:缺失值数据预处理有哪些方法?https://juejin.im/post/5b5c4e6c6fb9a04f90791e0c 处理缺失值的方法如下:删除记录,数据填补和不处理。主要以数据填补为主。 1 删除记录:该种方法在样本数据量十分…

秋招视频攻略!13个offer,8家SSP的Q神谈算法岗秋招技巧

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术大家还记得几个月前卖萌屋Q神推送的那期《13个offer,8家SSP,谈谈我的秋招经验》吗?据说Q神掌握了影分身的话,一毕业就能年薪600万,咳咳。。。ps&…

Python中的Argparse模块

argparse模块 作用: argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。 使用步骤: import a…

分治应用--最近点对问题 POJ 3714

文章目录1. 问题描述2. 解题思路3. 实现代码4. POJ 37141. 问题描述 二维平面上有n个点,如何快速计算出两个距离最近的点对? 2. 解题思路 暴力做法是,每个点与其他点去计算距离,取最小的出来,复杂度O(n2)采用分治算…

Java多线程系列(十):源码剖析AQS的实现原理

在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS。 本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计…

玩转二算法课的笔记-第一章

1 问题:对一组数据进行排序 回答:快速排序算法o(NLOGN),错误。 关键词:思考 应该问面试官,这组数据有什么样的特征? 比如;有没有可能包含大量重复的元素? 如果有这个可能的话,三路快…