文章目录

  • 一、zip的简单介绍:
  • 二、简单使用场景介绍:
  • 1、循环一个列表(获取对应的下表和值):
  • 2、循环俩个列表(这种我代码中用的比较多):
  • 3、zip(*)解压


一、zip的简单介绍:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。

我们可以使用 list() 转换来输出列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

二、简单使用场景介绍:

这个内置模块我还是看到一个别人写的博客中用到这个模块,然后不太明白,就搜了下简单使用,不过感觉还不错,对于爬虫提取数据的时候,确实有用,下面我举几个我以后工作中会用到的小例子:

1、循环一个列表(获取对应的下表和值):

如果是之前,我会使用循环的时候,然后使用一个变量num作为一个递增当作下标。

# 1、获取对应的列表
# 我之前的用法
list_demo1 = [''+ str(i) for i in range(100000)]
start_time = time.time()
num = 0
for i in list_demo1:

    print(num,i)
    num += 1
end_time = time.time()
print(end_time-start_time)
# 0.4557325839996338

使用zip,因为使用的range循环模拟真实场景,所以次数要多一点,不然时间间隔看不出来效果,效率差不多,不过我感觉zip返回的是个压缩,如果过大,我感觉直接遍历就行,不用使用list转化了。

# 我使用zip的用法
list_demo1 = ['' + str(i) for i in range(100000)]
start_time = time.time()
index_list = (i for i in range(len(list_demo1)))
for num, i in zip(index_list, list_demo1):
    print(num, i)
end_time = time.time()
print(end_time - start_time)
# 0.42674970626831055

如果想要一个列表list,里面是元组,也可以使用enumerate内置模块,自动配置下标,就是比zip上面的方法稍微满一点,不过这个如果只是需要下标,这个内存最简单。

# # 我使用zip的用法
list_demo1 = ['' + str(i) for i in range(100000)]
start_time = time.time()

result = enumerate(list_demo1)
for i in result:
    print(i)
end_time = time.time()
print(end_time - start_time)
# 0.627619743347168

2、循环俩个列表(这种我代码中用的比较多):

需求:俩个list,需要对应的下标位置的元素,需要拼接成一个元素,比如以爬取的一次IP和端口号为例吧:

re_ip_address = ['115.231.5.230', '114.239.147.135', '123.163.97.18', '223.243.255.167', '121.232.148.178',
                 '121.233.109.15', '114.239.250.93', '58.23.230.24', '220.168.52.245', '183.166.102.92',
                 '219.159.38.209', '47.100.21.174', '163.204.245.172', '118.180.166.195', '182.35.86.221']
re_port = ['44524', '9999', '9999', '65309', '9000', '9999', '9999', '8118', '39107', '9999', '56210', '8021', '9999',
           '8060', '9999']

for ip, port in zip(re_ip_address, re_port):
    print(ip + ':' + port)

打印的就是这种的。这种方法很方便,不然循环提取一个html中的a标签的text和href,之前我都是提取a标签,比如,现在就可以使用xpath提取一个a标签的list和href的list,然后使用这个,我感觉效率肯定比之前一个一个遍历再提取快的多。如果这种有时候一个项目提取次数要达到几百万甚至上千万,效率和节省的时间就体现出来了。

enumerate在python中的用法 python enumerate用法_元组

下面写下我之前用的方法:

# 用下标方法,循环俩个list
re_ip_address = ['115.231.5.230', '114.239.147.135', '123.163.97.18', '223.243.255.167', '121.232.148.178',
                 '121.233.109.15', '114.239.250.93', '58.23.230.24', '220.168.52.245', '183.166.102.92',
                 '219.159.38.209', '47.100.21.174', '163.204.245.172', '118.180.166.195', '182.35.86.221']
re_port = ['44524', '9999', '9999', '65309', '9000', '9999', '9999', '8118', '39107', '9999', '56210', '8021', '9999',
           '8060', '9999']

for i in range(len(re_ip_address)):
    ip = re_ip_address[i]
    port = re_port[i]
    ip_one = ip + ":" + port
    print('ip_one', ip_one)

3、zip(*)解压

这个功能只是把之前的zip压缩的列表,返回成元组tuple类型返回,我自我感觉目前没有什么用,需要我直接tuple换就行了。

re_ip_address = ['115.231.5.230', '114.239.147.135']
re_port = ['44524', '9999']

result1 = zip(re_ip_address, re_port)
result2 = zip(* result1)
print('result2',result2)
print('result2',list(result2))

enumerate在python中的用法 python enumerate用法_a标签_02

直接tuple我感觉更简单:

re_ip_address = ['115.231.5.230', '114.239.147.135']
re_port = ['44524', '9999']
result = [tuple(re_ip_address),tuple(re_port)]
print('result2', result)

enumerate在python中的用法 python enumerate用法_元组_03