Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2010 07:54:26

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как понимать этот код?

Долгое время писал на php, теперь столкнулся с Питоном
вот строка, которая делает список list уникальным (без повторов)

list = [111,222,333,111]
list = dict(map(lambda i: (i, 1), list)).keys()
Пытаюсь это понять
lambda - это безымянная функция, насколько я понял, типа этого:
 x = lambda a, b: (a*b)
x(4,4) # 16
а тут
lambda i: (i, 1)
что она возвращает?
>>> z = lambda i: (i, 1)
>>> z(8)
(8, 1) # ??



Офлайн

#2 Окт. 6, 2010 08:00:09

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

как понимать этот код?

Игнат
>>> z = lambda i: (i, 1)
>>> z(8)
Это как если бы вы писали:
z = (8,1)
(8,1) - это кортеж (неизменяемый список), состоящий из двух элементов.

>>> z = (8,1)
>>> z
(8, 1)
>>> z[0]
8
>>> z[1]
1



Отредактировано (Окт. 6, 2010 08:01:33)

Офлайн

#3 Окт. 6, 2010 09:08:11

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

как понимать этот код?

про уникальные списки здесь уже писали
более читаемый вариант со словарем

x = [111, 222, 333, 111]
x = dict(zip(x, x)).keys() # python 2.x
x = list(dict(zip(x, x)).keys()) # python 3.x
самый быстрый способ
x = list(set(x))



Офлайн

#4 Окт. 6, 2010 14:59:06

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как понимать этот код?

спасибо!
непонятно только почему dict должен принимать zip с длиной 2: (zip(x, x))

и почему dict(zip(x, x)).keys() нельзя вызвать дважды:

 lst = [111,222,111,222,333]
zp = zip(lst, lst)

>>> print(dict(zp).keys())
dict_keys([333, 222, 111])
>>> print(dict(zp).keys()) # повторяем
dict_keys([]) # уже пустой



Офлайн

#5 Окт. 6, 2010 20:39:50

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

как понимать этот код?

Все дело в том, что функция zip возвращает итератор, по которому, как известно, можно пробежаться лишь однажды. Вызов dict(zp) как раз это и делает и “опустошает” итератор.



Отредактировано (Окт. 6, 2010 20:40:56)

Офлайн

#6 Окт. 7, 2010 01:06:05

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

как понимать этот код?

> почему dict должен принимать zip
dict не должен принимать zip. dict может сделать словарь из списка, котором состоит из двухэлементных кортежей (ключ и значение), zip именно такой список и собирает (склеивает пару списков).

> функция zip возвращает итератор
Только в Python 3.

..bw



Офлайн

#7 Окт. 7, 2010 02:52:49

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

как понимать этот код?

bw
> функция zip возвращает итератор
Только в Python 3.
А во втором питоне что она возвращает?
В 3-м, кстати, она возвращает на самом деле некий zip-объект, наделенный свойствами итератора.



Офлайн

#8 Окт. 7, 2010 03:32:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

как понимать этот код?

>>> zip("abc", "def")
[('a', 'd'), ('b', 'e'), ('c', 'f')]
>>>
.keys() и set() могут перемешать список



Отредактировано (Окт. 7, 2010 03:34:27)

Офлайн

#9 Окт. 7, 2010 04:12:31

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

как понимать этот код?

> А во втором питоне что она возвращает?

>>> type(zip(range(5), range(5)))
<type ‘list’>

> .keys() и set() могут перемешать список
Это да, об этом нужно помнить. Порядок сохраняется в списке и в кортеже, но словарь или массив ни чего не обещают. Хотя в природе часто встречаются реализации упорядоченных или отсортированных словарей, но насколько я знаю, в батарейки они всё ещё не включены (Python II).

..bw



Офлайн

#10 Окт. 7, 2010 06:52:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

как понимать этот код?

>>> la
[111, 222, 333, 111, 111, 222, 333, 111]
>>> lb = []
>>> for i in la:
... if i not in lb:
... lb.append(i)
...
>>> lb
[111, 222, 333]
>>>
такая сохраняет порядок (это на всякий случай, может автору топика понадобится)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version