我有以下代码,想知道是否有更简单的方法可以做到这一点。我正在创建一个元组列表,其中包含字符串中的字母和列表中的相应数字。这里是
s="hello"
lst=[1,2,3,4,5]
res = []
for i in range(len(lst)):
res.append((s[i],lst[i]))
print res
输出在这里是正确的。如果可能的话,我正在寻找精简版
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
这个怎么样:
>>> s = "hello"
>>> lst = [1, 2, 3, 4, 5]
>>> zip(s, lst)
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
请注意,它在这里有效,因为列表和字符串的长度相等。否则,您可能会截断。
编辑:
>>> s = "hell"
>>> lst = [1, 2, 3, 4, 5]
>>> zip(s, lst)
[('h', 1), ('e', 2), ('l', 3), ('l', 4)]
lst
您错过了最后一项。
利用zip()
功能:
此函数返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。
演示:
>>> s="hello"
>>> lst=[1,2,3,4,5]
>>>
>>> zip(s, lst)
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
请注意,在 Python 3.x 中,zip()
返回一个迭代器。您必须将返回值包装在list(zip(s, lst))
, 以使其成为一个列表。
要在 Python 2.x 中获取迭代器,请使用itertools。izip()
. 此外,如果您的序列长度不相等,那么您可以使用itertools。izip_longest()
.
>>> s="hell" # len(s) < len(lst)
>>> lst=[1,2,3,4,5]
>>>
>>> zip(s, lst) # Iterates till the length of smallest sequence
[('h', 1), ('e', 2), ('l', 3), ('l', 4)]
>>>
>>> from itertools import izip_longest
>>> list(izip_longest(s, lst, fillvalue='-'))
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('-', 5)]
这是zip的快照:
>>> s="hello"
>>> lst=[1,2,3,4,5]
>>> zip(s, lst)
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
>>>
请注意,我是在 Python 2.x 中编写的。在 Python 3.x 中,您需要这样做:
>>> s="hello"
>>> lst=[1,2,3,4,5]
>>> zip(s, lst)
<zip object at 0x021C36C0>
>>> list(zip(s, lst))
[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)]
>>>
这是因为,正如 demostarted 一样,Python 3.xzip
返回一个 zip 对象,而不是像 Python 2.x 中那样返回一个列表。
我不知道列表是否总是只是单调数字,但如果是,您可以用 range() 替换它,或者使用 enumerate 来制作这一行:
s = 'hello'
sd = dict([reversed(x) for x in enumerate(s)])
s = 'hello'
zip(s, xrange(len(s)))