Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2008 10:05:51

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

__builtin__.unzip

Никто не сталкичался, в Python есть функция выполняющая обратную операцию zip?
Я понимаю что её не сложно реализовать самому (особенно для частного случая), но правильнее было бы использовать что-то уже готовое или просто хорошо подходящее для это задачи. К тому, если такая встроенная функция есть, вероятно она оптимизированна и будет работать лучше чем на pure python.

..bw



Офлайн

#2 Авг. 19, 2008 10:14:23

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

__builtin__.unzip

Наверное это и будет ответом на твой вопрос:

http://lists.canonical.org/pipermail/kragen-hacks/2002-February/000322.html



Офлайн

#3 Авг. 19, 2008 10:16:31

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

__builtin__.unzip

и еше это, кажется получше будет:
http://www.daniweb.com/code/snippet361.html



Офлайн

#4 Авг. 19, 2008 13:06:01

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

__builtin__.unzip

Вроде нету. Да и как то не особо часто она нужна.

def unzip(ls):    
"""
>>> ls1, ls2, ls3 = ['/', '+', '-'], [1, 2, 3], ['a', 'b', 'c']
>>> ls1, ls2, ls3 = unzip(zip(ls1, ls2, ls3))
>>> print ls1, ls2, ls3
['/', '+', '-'] [1, 2, 3] ['a', 'b', 'c']
"""
for x in map(lambda n: map(lambda x: x[n], ls), xrange(len(ls))):
yield x

if __name__ == "__main__":
import doctest
doctest.testmod()



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Авг. 19, 2008 16:30:02

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

__builtin__.unzip

>>> list(unzip(zip(['/', '+', '-', ':'], [1, 2, 3, 4], ['a', 'b', 'c', 'd'])))
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 8, in unzip
File "<input>", line 8, in <lambda>
File "<input>", line 8, in <lambda>
IndexError: tuple index out of range
regall, речь о другом zip'е.

Так работает:
def iunzip(ls):
"""
>>> ls = ['/', '+', '-', ':'], [1, 2, 3, 4], ['a', 'b', 'c', 'd']
>>> list(iunzip(zip(*ls)))
[['/', '+', '-', ':'], [1, 2, 3, 4], ['a', 'b', 'c', 'd']]
>>> list(iunzip([]))
[]
"""
if ls:
for x in map(lambda n: map(lambda x: x[n], ls), range(len(ls[0]))):
yield x
Про doctest не знал, прикольная вещь.

..bw



Отредактировано (Авг. 19, 2008 16:40:28)

Офлайн

#6 Авг. 20, 2008 06:03:44

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

__builtin__.unzip

bw
Так работает:
Ага, прокосячился :(, неудачный пример для отладки выбрал - количество элементов в списке равно количеству элементов в элементе списка



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version