灵活操作Python列表

Python非常简洁和优雅,今天看看Python中操作列表的一些灵活方法。


map

map是一个Python类(旧版本中是一个方法),但是我们利用map的构造函数,可以生成一个可迭代的map对象,该对象类似于列表。map的构造函数接受两个参数,第一个参数是一个函数,当函数足够简单时,可以是一个lambda表达式,该函数用来处理第二个参数,第二个参数要求是可迭代的,而列表就是可迭代的。所以,我们可以使用map方法,对列表进行操作,生成一个新的迭代对象。说着挺抽象,看看例子:


>>> def twice(num):
            return num * 2

>>> a = [1,2,3]

>>> result = map(twice, a)

>>> print(list(result))

[2, 4, 6]


首先定义一个twice函数,用来为一个数乘2,然后定义一个列表a,调用map生成一个可迭代对象,然后通过list转化为列表后,打印输出。输出结果正是我们预期的。由于twice这个方法很简单,我们可以用lambda函数进行简化


>>> result = map(lambda x : x * 2, a)
>>> print(list(result))
[2, 4, 6]


列表推导

如果你认为这就满足了,那就大错特错了,Python还有更加简单的方法完成上面的任务,那就是列表推导,看下面的例子


>>> [x * 2 for x in a]
[2, 4, 6]


就是这么简单,我们遍历a列表的元素,将其赋值给x,然后用x * 2的值填充一个新的列表。如果觉得不够爽快,再来看看


>>> [x * 2 for x in a if x % 2 != 0]
[2, 6]


取出a中的奇数,然后对其进行乘2运算,生成一个列表。再看一个复杂点的


>>> [x + y for x in a if x % 2 != 0 for y in a if y % 2 == 0]
[3, 5, 5, 7, 7, 9]


是不是有点蒙了,一起来看看结果是什么意思。


>>> [x for x in a if x % 2 != 0]
[1, 3, 5]

>>> [y for y in a if y % 2 == 0]
[2, 4]


第一个for生成3个元素的列表,第二个for生成2个元素的列表,而上面的结果是排列组合2 * 3 个元素的列表,这样大家差不多就明白了,上面复杂的结果,是排列组合后,将x和y数据对求和生成了列表。


由于字符串可以理解为字符的列表,也能操作字符串


>>> a="aeiou"
>>> [str.upper(x) for x in a]
['A', 'E', 'I', 'O', 'U']


range

range类很简单,和map类似,利用构造函数生成一个range对象,该对象可迭代,参数可以指定终止数字,起始和终止数字,起始和终止数字外加步长三种形式,直接看例子


>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


>>> list(range(3,10))
[3, 4, 5, 6, 7, 8, 9]


>>> list(range(3,10,2))
[3, 5, 7, 9]


enumerate

先看一个range的例子

>>> a = [1,2,3,4,5]

>>> for i in range(len(a)):
 print('index %d: %d' % (i, a[i]))

 
index 0: 1
index 1: 2
index 2: 3
index 3: 4
index 4: 5


但使用enumrate,则:

>>> for i, num in enumerate(a):
           print('index %d: %d' % (i, num))

 
index 0: 1
index 1: 2
index 2: 3
index 3: 4
index 4: 5


更加简洁。


zip

zip可以操作两个列表,如下所示


>>> for num1, num2 in zip(a, b):
           print(num1 + num2, end=" ")

 
5 7 9


以上就是一些Python常用的操作列表的方法,这里再说明一下,如果我们的列表很大,例如:


>>>a=list(range(10000))


你可以试着打印一下a,估计界面会卡住XD,10000个数实在太大了,占用内存实在不小。如果使用上面的方法操作这个列表会很耗费资源,比如列表推导,会生成一个等大的列表,这个时候怎么办呢?我们可以使用生成器表达式,Python处理生成器不是一下子产生所有数据,而是用到一个生成一个,不过生成器只能够迭代一轮。看看例子


>>> a=list(range(10000))
>>> it = (x * 2 for x in a)
>>> it
<generator object <genexpr> at 0x00000215BC711BA0>
>>> print(next(it))
0
>>> print(next(it))
2


每次调用next,从迭代器生成一个数字,而不是一口气生成10000个数字,而且生成器表达式也很简单,就是将前面列表推导的[]换成()。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值