Python 之 list 创建、合并、排序、统计、复制、遍历删除等

____tz_zs

一、列表(list)

列表(list)是有序的元素集合,列表中每个元素类型可以不同。
可通过索引访问单个元素,如 list[2], list[-1],也可通过区间索引访问子列表内容(左闭右开),如 list[2:5], list[-3:]。

(1)创建列表

  • list() 函数生成列表
l = list()
print(l)  # []
l = list((1, 2, 3, 4, 5))
print(l)  # [1, 2, 3, 4, 5]
l = list(range(5))
print(l)  # [0, 1, 2, 3, 4]
l1 = list("abcdefg")
print(l1)  # ['a', 'b', 'c', 'd', 'e', 'f', 'g']
  • 列表生成式,生成列表
l = [i * 10 for i in range(5)]
print(l)  # [0, 10, 20, 30, 40]
l = [i.upper() for i in "abcdefg"]
print(l)  # ['A', 'B', 'C', 'D', 'E', 'F', 'G']
l = ["%s_%s" % (k1, k2) for k1, k2 in zip(['a', 'b', 'c'], ['A', 'B', 'C'])]
print(l)  # ['a_A', 'b_B', 'c_C']
# 多层循环嵌套
l = ["%s_%s" % (k1, k2) for k1 in ['a', 'b', 'c'] for k2 in ['A', 'B', 'C']]
print(l)  # ['a_A', 'a_B', 'a_C', 'b_A', 'b_B', 'b_C', 'c_A', 'c_B', 'c_C']
# 字典生成列表
l = [k + " = " + v for k, v in {'a': 'A', 'c': 'C', 'b': 'B'}.iteritems()]
print(l)  # ['a = A', 'c = C', 'b = B']
# 使用 if 语句对列表进行筛选
l = [i for i in range(10) if i % 2 == 0]
print(l)  # [0, 2, 4, 6, 8]
# 参考 https://www.liaoxuefeng.com/wiki/1016959663602400/1017317609699776
l = [i if i % 2 == 0 else i + 10 for i in range(10)]
print(l)  # [0, 11, 2, 13, 4, 15, 6, 17, 8, 19]

(2)添加元素、合并列表

  • extend 合并(拼接)两个列表,相当于 a[len(a):] = [x] 。
    • list1 + list2
    • list.extend(list2)
    • list[len(list):] = list2
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1 + l2
print(l1)  # [1, 2, 3, 4]
print(l2)  # ['a', 'b', 'c']
print(l3)  # [1, 2, 3, 4, 'a', 'b', 'c']

l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.extend(l2)
print(l1)  # [1, 2, 3, 4, 'a', 'b', 'c']
print(l2)  # ['a', 'b', 'c']
print(l3)  # None

l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l1[len(l1):] = l2
print(l1)  # [1, 2, 3, 4, 'a', 'b', 'c']
print(l2)  # ['a', 'b', 'c']
print(l3)  # None
  • 生成 n 个重复元素的列表
    • list * n
l2 = ['a', 'b', 'c']

l3 = l2 * 3
print(l3)  # ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
  • append 将单个元素或list添加到列表末尾,相当于 a[len(a):] = [x] 。
    • list.append(x)
    • list.append(list2)
    • list[len(list):] = [list2]
l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.append(5)
l4 = l2.append("d")

print(l1)  # [1, 2, 3, 4, 5]
print(l2)  # ['a', 'b', 'c', 'd']
print(l3)  # None
print(l4)  # None

l1 = [1, 2, 3, 4]
l2 = ['a', 'b', 'c']
l3 = l1.append(l2)
print(l1)  # [1, 2, 3, 4, ['a', 'b', 'c']]
print(l2)  # ['a', 'b', 'c']
print(l3)  # None
  • insert 在位置 i 处插入新元素 x。
    • list.insert(i, x)
l1 = [0, 1, 2, 3, 4]
l2 = l1.insert(3, "aaa")
print(l1)  # [0, 1, 2, 'aaa', 3, 4]
print(l2)  # None

(3)删除 list 中的元素

  • list.remove(x) 删除列表中第一次出现的元素 x 。如果没有这个元素,则抛出 ValueError 异常。
  • list.pop(i) 返回列表中 i 位置上的元素,并将其删除(如果没有传入参数 i,则默认删除最后一个)。如果列表为空或索引超出范围,则引发 IndexError。
  • del list[i] 删除列表中 i 位置上的元素。
  • list.clear() 移除列表中的所有元素。作用等同于 del a[:]

(4)对 list 中元素进行排序/乱序

  • list.sort() 对列表元素排序,直接修改原列表。
    python2 中可以对不同类型的变量进行排序。
list1 = [2, 4, 3, 1, "6", "a", 5, 9, 7]
list1.sort(cmp=None, key=None, reverse=False)
print list1
"""
[1, 2, 3, 4, 5, 7, 9, '6', 'a']
"""

python3 无法对不同类型的变量进行排序,会报错:

TypeError: '<' not supported between instances of 'str' and 'int'
  • sorted() 是 Python 标准库中的内置函数,对所有可迭代的对象进行排序操作,返回一个新列表。ps:无论输入的是元组、列表、集合,它将始终返回一个列表。
    sorted(iterable, key=None, reverse=False)
    • iterable – 可迭代对象。
    • key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
list1 = [2, None, 4, 3, 1, "6", "a", 5, 9, 7]
print(list1)  # [2, None, 4, 3, 1, '6', 'a', 5, 9, 7]
list2 = sorted(list1, key=lambda x: str(x))
print(list2)  # [1, 2, 3, 4, 5, '6', 7, 9, None, 'a']
list3 = sorted(list1, key=lambda x: x)
print(list3)  # TypeError: '<' not supported between instances of 'NoneType' and 'int'
  • list.reverse() 将列表元素逆序排序。
  • random.shuffle(list) 将列表元素乱序。

(5)查询和统计 list 中的元素

  • len(list) 返回列表长度(元素个数)。
  • x in list 检查元素是否在列表中。
  • list.count(x) 返回元素 x 在列表中的数量。
  • list.index(x) 返回第一次出现元素 x 的索引值。如果没有这样的元素将会抛出 ValueError 异常。

(6)复制 list 的各种方式

  • list.copy() 返回列表的一个浅拷贝,等价于 a[:]。
import copy

a = [[11], 2, 3]
print("a :", id(a), a)  # a : 139793256279112 [[11], 2, 3]

a1 = a
a2 = a[:]
a3 = list(a)
a4 = a.copy()
a5 = copy.copy(a)
a6 = copy.deepcopy(a)

print("a1 :", id(a1), a1)
print("a2 :", id(a2), a2)
print("a3 :", id(a3), a3)
print("a4 :", id(a4), a4)
print("a5 :", id(a5), a5)
print("a6 :", id(a6), a6)
"""
a1 : 139793256279112 [[11], 2, 3]
a2 : 139793256278344 [[11], 2, 3]
a3 : 139793256317576 [[11], 2, 3]
a4 : 139793256278472 [[11], 2, 3]
a5 : 139793256318792 [[11], 2, 3]
a6 : 139793256278408 [[11], 2, 3]
"""

a.append(4)
a[0].append(22)

print("a1 :", id(a1), a1)
print("a2 :", id(a2), a2)
print("a3 :", id(a3), a3)
print("a4 :", id(a4), a4)
print("a5 :", id(a5), a5)
print("a6 :", id(a6), a6)
"""
a1 : 139793256279112 [[11, 22], 2, 3, 4]
a2 : 139793256278344 [[11, 22], 2, 3]
a3 : 139793256317576 [[11, 22], 2, 3]
a4 : 139793256278472 [[11, 22], 2, 3]
a5 : 139793256318792 [[11, 22], 2, 3]
a6 : 139793256278408 [[11], 2, 3]
"""

参考

https://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list
https://www.cnblogs.com/ifantastic/p/3811145.html

二、遍历list同时对list进行修改的问题

在遍历list的同时对list本身进行增删,将会发生越界和漏值的问题。这是因为当执行for语句的时候,迭代次数就已经被 in 后面的可迭代对象确定了。

(1)问题示例:

list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for d in list1:
    print(d)
    if d == 'c':
        list1.remove(d)
print(list1)
"""
a
b
c
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""

list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for i in range(len(list1)):
    print(list1[i])
    if list1[i] == 'c':
        list1.pop(i)
        # list1.remove(list1[i])
"""
a
b
c
e
f
g
Traceback (most recent call last):
  File "/home/zmate/tzzs/mytz/df_test.py", line 65, in <module>
    print(list1[i])
IndexError: list index out of range
"""

(2)替代方法

如果确实需要在遍历的同时修改list,则可采用以下集中方法。

  • 使用while,在面对这样情况的时候可以灵活应对。
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
i = 0
while i < len(list1):
    print(list1[i])
    if list1[i] == 'c':
        del list1[i]
    else:
        i += 1
print(list1)
"""
a
b
c
d
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""
  • 遍历拷贝的list、但修改原有的list
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list1_copy = list1.copy()

for d in list1_copy:
    print(d)
    if d == 'c':
        list1.remove(d)
print(list1)
"""
a
b
c
d
e
f
g
['a', 'b', 'd', 'e', 'f', 'g']
"""

(3)参考

https://www.zhihu.com/question/49098374
https://docs.python.org/3/tutorial/controlflow.html#for-statements

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值