Сжатие кода или возможный однострочник для этого кода в Python

У меня есть следующий код, и мне интересно, есть ли более простой способ сделать это. Я создаю список кортежей, который содержит буквы из строки и соответствующий номер из списка. вот

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 ответа

Решение

Как насчет этого:

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

Я не знаю, является ли список всегда просто монотонными числами, но если они есть, вы можете либо заменить его на range(), либо использовать enumerate, чтобы сделать эту одну строку:

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

s = 'hello'
zip(s, xrange(len(s)))

Это оснастка с почтовым индексом:

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

Это потому, что, как уже было продемонстрировано, Python 3.x zip возвращает объект zip вместо списка, как это было в Python 2.x.

Другие вопросы по тегам