蒙珣的博客

活好当下,做好今天该做的事情。

0%

python zip()函数

  1. zip含有两种,其中一种是zip()——压缩,另外一种是zip(* )——解压
  2. zip 函数在 Python 2 和 Python 3 中是有所不同的:
    • 在 Python 3.x 中为了减少内存,zip() 返回的是一个对象object。如果需展示列表,需手动 list() 转换。
    • 在Python2.x中返回的是一个列表list。

语法

1
zip([iterable, ...])

参数

iterable:一个序列或其他的可迭代对象

功能

将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。(可利用 * 号操作符,可以将元组解压为列表。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>>> str=(["a","b","c"],["1","2","3","4"])

# zip压缩
>>> a1=zip(str)
# zip解压
>>> a2=zip(*str)

# 输出压缩后的a1
>>> list(a1)
[(['a', 'b', 'c'],), (['1', '2', '3', '4'],)]

# 输出解压后的a2
>>> list(a2)
[('a', '1'), ('b', '2'), ('c', '3')]


>>> a1
<zip object at 0x7f273dc97200>

>>> type(a1)
<class 'zip'>

在LeetCode上有一道题(14.Longest Common Prefix),使用set()与zip()函数是最快的解决方法,时间复杂度也是最小的。https://leetcode.com/problems/longest-common-prefix/ 。下面贴出解答方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def longsetCommonPrefix(strs):

# 初始化一个字符串s,用来接受无门要求的最长的公共前缀
s = ""

# 1. 先判断strs是不是一个空字符串,如果是,则返回 ”“
if len(strs) == 0:
return ""
# print(list(zip(strs)))
# print(list(zip(*strs)))

# 2. 利用zip(*)函数对字符串strs进行解压,得到一个列表,再遍历该列表
# 该列表是由字符串strs每个元素打包成一个一个元组,然后再将这些元组解压(拆分)

for each in zip(*strs):
# 3. 对zip解压得到的列表中的每个元素用set()创建一个无序不重复的元素集合
# 判断每个集合的长度是否为1,如果为1,则说明是公共前缀,并入字符串s中

# 利用集合创建一个无序不重复的元素集
if len(set(each)) == 1:
# print(set(each))
s += each[0]

else:
return s

return res

调用longestCommonPrefix()函数:

1
2
3
str = ["flower","flow","flight"]

print("最大公共前缀为:%s" %longsetCommonPrefix(str))

下面是Python的运行结果:

1
2
3
4
5
[('flower',), ('flow',), ('flight',)]
[('f', 'f', 'f'), ('l', 'l', 'l'), ('o', 'o', 'i'), ('w', 'w', 'g')]
{'f'}
{'l'}
最大公共前缀为:fl

转载自:https://blog.csdn.net/weixin_44412496/article/details/97925652