zip() - 类似于内置函数,从左边填充不等长度,无值

col*_*yre 4 python built-in python-itertools python-3.x

是否有一个像zip()一样工作的内置函数,但填充结果,以便结果列表的长度是最长输入的长度,并从左边填充列表,例如None

已经有一个答案使用zip_longestitertools模块和相应的问题是非常相似这一点.但zip_longest似乎你只能从右边填充缺失的数据.

这可能是一个用例,假设我们只存储了这样的名称(这只是一个例子):

header = ["title", "firstname", "lastname"]
person_1 = ["Dr.", "Joe", "Doe"]
person_2 = ["Mary", "Poppins"]
person_3 = ["Smith"]
Run Code Online (Sandbox Code Playgroud)

没有像(["Poppins", "Mary"],["Poppins", "Dr", "Mary"])等其他排列.

如何使用内置函数获得这样的结果?

>>> dict(magic_zip(header, person_1))
{'title': 'Dr.', 'lastname': 'Doe', 'firstname': 'Joe'}
>>> dict(magic_zip(header, person_2))
{'title': None, 'lastname': 'Poppins', 'firstname': 'Mary'}
>>> dict(magic_zip(header, person_3))
{'title': None, 'lastname': 'Smith', 'firstname': None}
Run Code Online (Sandbox Code Playgroud)

Aus*_*tin 5

使用zip_longest反向列表.

示例:

from itertools import zip_longest

header = ["title", "firstname", "lastname"]
person_1 = ["Dr.", "Joe", "Doe"]
person_2 = ["Mary", "Poppins"]
person_3 = ["Smith"]

print(dict(zip_longest(reversed(header), reversed(person_2))))
# {'lastname': 'Poppins', 'firstname': 'Mary', 'title': None}
Run Code Online (Sandbox Code Playgroud)

关于你的用例:

>>> dict(zip_longest(reversed(header), reversed(person_1))) 
{'title': 'Dr.', 'lastname': 'Doe', 'firstname': 'Joe'}
>>> dict(zip_longest(reversed(header), reversed(person_2)))
{'lastname': 'Poppins', 'firstname': 'Mary', 'title': None} 
>>> dict(zip_longest(reversed(header), reversed(person_3))) 
{'lastname': 'Smith', 'firstname': None, 'title': None}
Run Code Online (Sandbox Code Playgroud)


DSM*_*DSM 5

只需zip_longest反向使用和读取参数:

In [20]: dict(zip_longest(header[::-1], person_1[::-1]))
Out[20]: {'lastname': 'Doe', 'firstname': 'Joe', 'title': 'Dr.'}

In [21]: dict(zip_longest(header[::-1], person_2[::-1]))
Out[21]: {'lastname': 'Poppins', 'firstname': 'Mary', 'title': None}

In [22]: dict(zip_longest(header[::-1], person_3[::-1]))
Out[22]: {'lastname': 'Smith', 'firstname': None, 'title': None}
Run Code Online (Sandbox Code Playgroud)

由于zip*函数需要能够处理一般的迭代,它们不支持"从左边"填充,因为你需要先耗尽迭代.在这里,我们可以自己翻转事物.