Найти - Пользователи
Полная версия: как понимать этот код?
Начало » Python для новичков » как понимать этот код?
1 2
Игнат
Долгое время писал на 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) # ??
Isem
Игнат
>>> z = lambda i: (i, 1)
>>> z(8)
Это как если бы вы писали:
z = (8,1)
(8,1) - это кортеж (неизменяемый список), состоящий из двух элементов.

>>> z = (8,1)
>>> z
(8, 1)
>>> z[0]
8
>>> z[1]
1
pyuser
про уникальные списки здесь уже писали
более читаемый вариант со словарем
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))
Игнат
спасибо!
непонятно только почему 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([]) # уже пустой
Isem
Все дело в том, что функция zip возвращает итератор, по которому, как известно, можно пробежаться лишь однажды. Вызов dict(zp) как раз это и делает и “опустошает” итератор.
bw
> почему dict должен принимать zip
dict не должен принимать zip. dict может сделать словарь из списка, котором состоит из двухэлементных кортежей (ключ и значение), zip именно такой список и собирает (склеивает пару списков).

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

..bw
Isem
bw
> функция zip возвращает итератор
Только в Python 3.
А во втором питоне что она возвращает?
В 3-м, кстати, она возвращает на самом деле некий zip-объект, наделенный свойствами итератора.
py.user.next
>>> zip("abc", "def")
[('a', 'd'), ('b', 'e'), ('c', 'f')]
>>>
.keys() и set() могут перемешать список
bw
> А во втором питоне что она возвращает?

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

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

..bw
py.user.next
>>> 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]
>>>
такая сохраняет порядок (это на всякий случай, может автору топика понадобится)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB