Python 中的 Zip 列表

2024-12-04 08:56:00
admin
原创
135
摘要:问题描述:我正在尝试学习如何“压缩”列表。为此,我有一个程序,在特定时刻,我会执行以下操作:x1, x2, x3 = stuff.calculations(withdataa) 这给了我三个列表,,,x1和x2,x3每个列表的大小都是 20。现在,我这样做:zipall = zip(x1, x2, x3) 但...

问题描述:

我正在尝试学习如何“压缩”列表。为此,我有一个程序,在特定时刻,我会执行以下操作:

x1, x2, x3 = stuff.calculations(withdataa)

这给了我三个列表,,,x1x2x3每个列表的大小都是 20。

现在,我这样做:

zipall = zip(x1, x2, x3)

但是,当我这样做时:

print "len of zipall %s" % len(zipall)

我得到了 20,这不是我预期的。我预期是 3。我想我做错了什么。


解决方案 1:

当你将zip()三个各包含 20 个元素的列表组合在一起时,结果将有 20 个元素。每个元素都是一个三元组。

请亲眼看看:

In [1]: a = b = c = range(20)

In [2]: zip(a, b, c)
Out[2]: 
[(0, 0, 0),
 (1, 1, 1),
 ...
 (17, 17, 17),
 (18, 18, 18),
 (19, 19, 19)]

要找出每个元组包含多少个元素,可以检查第一个元素的长度:

In [3]: result = zip(a, b, c)

In [4]: len(result[0])
Out[4]: 3

当然,如果列表一开始就是空的,那么这将不起作用。

解决方案 2:

zip需要一堆列表喜欢

a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...

并将它们“压缩”到一个列表中,该列表的条目为 3 元组(ai, bi, ci)。想象一下从左到右水平绘制一个拉链。

解决方案 3:

在 Python 2.7 中这可能工作得很好:

>>> a = b = c = range(20)
>>> zip(a, b, c)

但在 Python 3.4 中应该是这样的(否则结果将是这样的<zip object at 0x00000256124E7DC8>):

>>> a = b = c = range(20)
>>> list(zip(a, b, c))

解决方案 4:

zip创建一个新列表,其中填充了包含可迭代参数元素的元组:

>>> zip ([1,2],[3,4])
[(1,3), (2,4)]

我希望您尝试创建一个元组,其中每个元素都是一个列表。

解决方案 5:

Python 3 zip中,返回一个迭代器,并需要将其传递给列表函数来获取压缩元组:

x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]

然后将unzip它们返回,只需将压缩的迭代器共轭即可:

x_back, y_back = zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')

如果需要列表的原始形式而不是元组:

x_back, y_back = zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']

解决方案 6:

来源:我的博客文章(格式更好)

例子

numbers = [1,2,3]
letters = 'abcd'

zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]

输入

零个或多个可迭代对象 [1] (例如列表、字符串、元组、字典)

输出(列表)

第一个元组 = (数字元素 1,字母元素 1)

第二元组 = (e_2 数字, e_2 字母)

第 n 个元组 = (e_n 个数字, e_n 个字母)

  1. n 个元组的列表:n 是最短参数(输入)的长度

* len(numbers) == 3 < len(letters) == 4 → short= 3 → 返回 3 个元组
  1. 每个元组的长度 = 参数的数量(元组从每个参数中获取一个元素)

* args = (numbers,letters); len(args) == 2 → 具有 2 个元素的元组
  1. i第 tuple = (element_i arg1, element_i arg2…, element_i arg n)

边缘情况

1)空字符串:len(str)= 0 = 没有元组

2)单个字符串:len(str)==2 元组,其中 len(args)==1 个元素

zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]

Zip 开始行动!

1. 用两个列表构建一个字典[2]

keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]

my_favorite = dict( zip(keys, values) )

my_favorite["drink"]
# 'La Croix'

my_faves = dict()
for i in range(len(keys)):
    my_faves[keys[i]] = values[i]
  • zip是一个优雅、清晰、简洁的解决方案

2. 打印表格中的列

“*” [3] 被称为“解包”:f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)

student_grades = [
[   'Morty'  ,  1   ,  "B"  ],
[   'Rick'   ,  4   ,  "A"  ],
[   'Jerry'  ,  3   ,  "M"  ],
[  'Kramer'  ,  0   ,  "F"  ],
]

row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']

columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')

额外收获:解压

zip(*args)之所以被称为“解压”,是因为它具有zip

numbers = (1,2,3)
letters = ('a','b','c')

zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]

unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
  • unzipped:tuple_1 = 每个压缩元组的 e1。tuple_2 = 每个压缩元组的 e2zipped


脚注

  1. 能够一次返回其成员的对象(例如列表 [1,2,3]、字符串 'I like codin'、元组 (1,2,3)、字典 {'a':1, 'b':2})

  2. {键 1:值 1,键 2:值 2...}

  3. “拆包”(*)

*代码:

# foo - function, returns sum of two arguments
def foo(x,y):
    return x + y
print foo(3,4)
# 7

numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)

print foo(*numbers)
# 3

*numbers(1 个参数) 并将其 2 个元素“解包”为 2 个参数

解决方案 7:

基本上,zip 函数适用于 Python 中的列表、元组和字典。如果您使用的是 IPython,则只需输入 zip? 并检查 zip() 的含义。

如果你没有使用 IPython,那么只需安装它:“pip install ipython”

对于列表

a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
zip(a, b)

输出为[('a', 'p'), ('b', 'q'), ('c', 'r')

对于字典:

c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
zip(c, d)

输出为:

[('gaurav', 'amit'),
 ('nilesh', 'swapnil'),
 ('ramesh', 'anish'),
 ('anu', 'raghu')]

解决方案 8:

为了完整性。

当压缩列表的长度不相等时,结果列表的长度将变为最短的列表,且不会发生任何错误

>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]

解决方案 9:

值得在这里添加,因为它是 zip 上排名很高的问题。zip是很棒的、惯用的 Python - 但对于大型列表来说,它的扩展性并不好。

而不是:

books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]

for book, word in zip(books, words):
   print('{}: {}'.format(book, word))

使用izip。对于现代处理,它将其存储在 L1 缓存内存中,并且对于较大的列表而言性能更高。使用它就像添加 一样简单i

for book, word in izip(books, words):
   print('{}: {}'.format(book, word))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用