Bootstrap

Python中zip函数及用法

        zip() 函数是 Python 内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。

和 Python 3.x 版本不同,Python 2.x 版本中的 zip() 函数会直接返回列表,而不是返回 zip 对象。但是,返回的列表或者 zip 对象,其包含的元素(都是元组)是相同的。

zip() 函数的语法格式为:

zip(iterable, ...)

其中 iterable,... 表示多个列表、元组、字典、集合、字符串,甚至还可以为 range() 区间。

下面程序演示了 zip() 函数的基本用法:

my_list = [11, 12, 13]
my_tuple = (21, 22, 23)
print([x for x in zip(my_list, my_tuple)])
my_dic = {31: 2, 32: 4, 33: 5}
my_set = {41, 42, 43, 44}
print([x for x in zip(my_dic)])
my_pychar = "python"
my_shechar = "shell"
print([x for x in zip(my_pychar, my_shechar)])

程序执行结果为:

        分析以上的程序和相应的输出结果不难发现,在使用 zip() 函数“压缩”多个序列时,它会分别取各序列中第 1 个元素、第 2 个元素、... 第 n 个元素,各自组成新的元组。需要注意的是,当多个序列中元素个数不一致时,会以最短的序列为准进行压缩。

        另外,对于 zip() 函数返回的 zip 对象,既可以像上面程序那样,通过遍历提取其存储的元组,也可以向下面程序这样,通过调用 list() 函数将 zip() 对象强制转换成列表:

        假设有三个长度不同的列表 a、b、c,可以使用 for 循环和 zip 函数将它们对应的元素一一输出。zip 函数可以将多个列表中的元素一一配对,生成一个元组的列表。

示例代码:

a = [1, 2, 3, 4]
b = ['a', 'b', 'c']
c = [True, False]

# 将三个列表对应的元素一一输出
print("三个列表对应的元素:")
for x, y, z in zip(a, b, c):
    print(x, y, z)

运行结果:

        需要注意的是,如果列表的长度不一致,zip 函数会以最短的列表长度为准,超出部分的元素将会被忽略。在上面的例子中,列表 c 的长度比其他两个列表要短,因此最后一个元素的值为 None。

        如果要将最长的列表的数据全部输出,可以先找到最长的列表长度,然后使用 range 函数循环这个长度,对于每个列表,如果下标超出了它的长度范围,就用空字符串代替。例如:

示例代码:

a = [1, 2, 3, 4]
b = ['a', 'b', 'c']
c = [True, False]

# 找到最长的列表长度
max_length = max(len(a), len(b), len(c))

# 将三个列表对应的元素一一输出
print("三个列表对应的元素:")
for i in range(max_length):
    x = a[i] if i < len(a) else ''
    y = b[i] if i < len(b) else ''
    z = c[i] if i < len(c) else ''
    print(x, y, z)

运行结果:

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;