60D4 – list 和 tumple 的 13 个经典使用案例

1. 判断 list 内有无重复元素

is_duplicated,使用 list 封装的 count 方法,依次判断每个元素 x 在 list 内的出现次数。

如果大于 1,则立即返回 True,表示有重复。
如果完成遍历后,函数没返回,表明 list 内没有重复元素,返回 False。

In [1]: def is_duplicated(lst):
   ...:     for x in lst:
   ...:         if lst.count(x) > 1: # 判断 x 元素在 lst 中的出现次数
   ...:             return True
   ...:     return False

调用 is_duplicated 方法:

In [2]: a = [1, -2, 3, 4, 1, 2]
   ...: print(is_duplicated(a))
True

以上方法实现不简洁,借助 set 判断更方便:

def is_duplicated(lst):
    return len(lst) != len(set(lst))

count( ) 方法用于统计某个元素在列表中出现的次数。
返回值:返回元素在列表中出现的次数。

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
返回值:返回新的集合对象。


2. 列表反转

一行代码实现列表反转,非常简洁。

  • [::-1] 这是切片的操作。
  • [::-1] 生成逆向索引(负号表示逆向),步长为 1 的切片。

所以,最后一个元素一直数到第一个元素。这样,不正好实现列表反转吗?

In [4]: def reverse(lst):
   ...:     return lst[::-1]

调用 reverse:

In [5]: r = reverse([1, -2, 3, 4, 1, 2])
   ...: print(r)  
[2, 1, 4, 3, -2, 1]

关于这类型的笔记如下:

a='python'
b=a[::-1]  # 倒叙  
print(b) # nohtyp  
c=a[::-2]  # 倒叙每隔一个字符输出一个字符
print(c) # nhy  
# 从后往前数的话,最后一个位置为-1  
d=a[:-1]  # 从位置0到位置-1之前的数  
print(d)  # pytho  
e=a[:-2]  # 从位置0到位置-2之前的数  
print(e)  # pyth  

3. 找出列表中的所有重复元素

遍历列表,如果出现次数大于 1,且不在返回列表 ret 中,则添加到 ret 中。
满足 x not in ret ,则表示 x 不在列表中。

In [6]: def find_duplicate(lst):
   ...:     ret = []
   ...:     for x in lst:
   ...:         if lst.count(x) > 1 and x not in ret: # 找到一个新的重复元素
   ...:             ret.append(x)
   ...:     return ret

调用 find_duplicate:

In [8]: r = find_duplicate([1, 2, 3, 4, 3, 2])
   ...: print(r)
[2, 3]

在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。
在 Python 中,为了使当进行赋值操作时,两个变量互补影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。

python append()与深拷贝、浅拷贝 – BjutHz – CSDN

append() 函数
当 list 类型的对象进行 append 操作时,实际上追加的是该对象的引用。

>>>alist = []
>>> num = [2]
>>> alist.append( num )
>>> id( num ) == id( alist[0] )
True

如上例所示,当num发生变化时(前提是 id(num) 不发生变化),alist的内容随之会发生变化。往往会带来意想不到的后果,想避免这种情况,可以采用深拷贝解决:

alist.append(copy.deepcopy(num))

注: id() 函数:返回对象的唯一标识,可以类比成该对象在内存中的地址。

页面: 1 2 3 4 5 6

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注