0

我有以下代码,想知道是否有更简单的方法可以做到这一点。我正在创建一个元组列表,其中包含字符串中的字母和列表中的相应数字。这里是

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)]
4

4 回答 4

7

这个怎么样:

>>> 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您错过了最后一项。

于 2013-09-27T17:42:34.087 回答
5

利用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)]
于 2013-09-27T17:41:45.413 回答
2

这是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 中那样返回一个列表。

于 2013-09-27T17:41:58.627 回答
2

我不知道列表是否总是只是单调数字,但如果是,您可以用 range() 替换它,或者使用 enumerate 来制作这一行:

s = 'hello'
sd = dict([reversed(x) for x in enumerate(s)])

s = 'hello'
zip(s, xrange(len(s)))
于 2013-09-27T18:53:31.087 回答