Сжатие кода или возможный однострочник для этого кода в 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.