Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Zip列表_Python_Python 2.7 - Fatal编程技术网

Python中的Zip列表

Python中的Zip列表,python,python-2.7,Python,Python 2.7,我正在努力学习如何“压缩”列表。为此,我有一个程序,在特定点上,我执行以下操作: x1, x2, x3 = stuff.calculations(withdataa) 这给了我三个列表,x1、x2和x3,每个都是20号 现在,我要: zipall = zip(x1, x2, x3) 然而,当我这样做时: print "len of zipall %s" % len(zipall) 我得到20分,这不是我所期望的。我以为是三个。我认为我做了一些根本错误的事情。当你把三个列表(每个列表包含20

我正在努力学习如何“压缩”列表。为此,我有一个程序,在特定点上,我执行以下操作:

x1, x2, x3 = stuff.calculations(withdataa)
这给了我三个列表,
x1
x2
x3
,每个都是20号

现在,我要:

zipall = zip(x1, x2, x3)
然而,当我这样做时:

print "len of zipall %s" % len(zipall)
我得到20分,这不是我所期望的。我以为是三个。我认为我做了一些根本错误的事情。

当你把三个列表(每个列表包含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

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

zip
创建一个新列表,用元组填充,元组包含iterable参数中的元素:

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

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

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)
。想象一下,从左到右水平地画一个拉链。

基本上,在Python中,zip函数适用于列表、元组和字典。 如果您使用的是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')]

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

>>> a = b = c = range(20)
>>> zip(a, b, c)
但在Python3.4中应该是这样的(否则,结果将类似于
):


为了完整起见

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

>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]
资料来源:

示例

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

zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
输入 零个或多个iterables[1](例如列表、字符串、元组、字典)

输出(列表) 第一个元组=(数字元素_1,字母元素_1)

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

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

  • n元组列表:n是最短参数(输入)的长度
    • len(数字)==3
  • 每个元组的长度=#个参数(元组从每个参数中获取一个元素)
    • args=(数字、字母);len(args)==2→ 具有2个元素的元组
  • i
    th元组=(元素i arg1,元素i arg2…,元素i arg
    n
  • 边缘案例 1) 空字符串:len(str)=0=无元组

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


    动作中的拉链! 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.打印表格中的列

    numbers = [1,2,3]
    letters = 'abcd'
    
    zip(numbers, letters)
    # [(1, 'a'), (2, 'b'), (3, 'c')]
    
    “*”[3]称为“解包”:
    f(*[arg1,arg2,arg3])==f(arg1,arg2,arg3)


    额外积分:解压
    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')]
    
    • unzip
      :每个压缩元组的元组_1=e1。每个
      压缩的元组的元组_2=e2

    脚注
  • 一个能够一次返回一个成员的对象(例如列表[1,2,3],字符串'I like codin',元组(1,2,3),字典{'a':1,'b':2})
  • {key1:value1,key2:value2…}
  • “拆包”(*)
  • *
    代码:

    # 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
    

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

    我认为
    zip
    不会返回一个列表。
    zip
    返回一个生成器。要获得元组列表,必须执行
    list(zip(a,b))

    x = [1, 2, 3]
    y = [4, 5, 6]
    zipped = zip(x, y)
    list(zipped)
    

    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')]
    
    然后,要
    将它们解压缩回来,只需共轭压缩迭代器即可:

    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']
    

    这里值得添加,因为这是一个关于zip的排名很高的问题。
    zip
    是很棒的、惯用的Python,但对于大型列表,它的伸缩性并不好

    而不是:

    books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
    words = [345, 567, ... , 672]
    
    for book, word in zip(books, words):
       print('{}: {}'.format(book, word))
    
    使用
    izip
    。对于现代处理,它将其存储在一级缓存内存中,对于更大的列表性能更高。使用它就像添加
    i
    一样简单:

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

    您希望
    zip
    做什么?为什么要有三个列表?它们看起来像什么?zip返回一个元组列表。zip(c,d)正在执行zip(list(c),list(d))@Sigur:问号表示Python2.7;这是Python3。此外,已经提到了这一点。问号表示Python2.7;这是Python3。此外,已经提到了这一点。len(结果[0])无法工作。“zip”对象不可用subscriptable@GilbertS在Python2
    zip
    中返回了一个列表。在Python3中,它是一个iterator@GilbertS在Python3中,使用
    list(zip(a,b,c))
    获得Python2的行为。
    books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
    words = [345, 567, ... , 672]
    
    for book, word in zip(books, words):
       print('{}: {}'.format(book, word))
    
    for book, word in izip(books, words):
       print('{}: {}'.format(book, word))