Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2019 11:06:35

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбор функции map

Прошу помочь разобраться полностью с вопросом функции map…
Есть объект типа map:

 a = map(int, (1, 2))
Можно ли достать его содержимое каким-то образом, не меняя его?
Проблема вот в чем собственно:
 a = map(int, (1, 2))
b = list(a)[0]
Вроде, как прекрасно работает и все хорошо, но как только более внимательно подойти к вопросу и добавить еще одну операцию типа:

 c = list(a)[1]
Тут же выяснится, что переменная a уже не далеко не та, что была раньше…Вот как побороть это парадокс?

Отредактировано first-step (Апрель 12, 2019 11:07:41)

Офлайн

#2 Апрель 12, 2019 11:24:26

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Разбор функции map

дело в том что map создает объект итератор,это надо понять.

 >>> a = map(int, ('1', '2','3'))
>>> for i in a:
	print(i)
1
2
3
>>> for i in a:
	print(i)	
>>>
как видите итератор извлекает объект и при повторном обращении там уже ничего нет.
грубый но надеюсь понятный пример работы
 >>> a = [1,3,4]
>>> b = len(a)
>>> def it():
	return a.pop(0)
>>> for _ in range(b):
	print(it())
1
3
4
>>> for _ in range(b):
	print(it())
Traceback (most recent call last):
  File "<pyshell#17>", line 2, in <module>
    print(it())
  File "<pyshell#9>", line 2, in it
    return a.pop(0)
IndexError: pop from empty list
поэтому для вашего случая а надо сразу приводить к типу списка
 a = list(map(int, ('1', '2')))

Офлайн

#3 Апрель 12, 2019 11:34:50

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбор функции map

А нет способа такого извлечения, чтобы не портить сам map объект?

Офлайн

#4 Апрель 12, 2019 11:44:17

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Разбор функции map

first-step
А нет способа такого извлечения, чтобы не портить сам map объект?
а зачем вам? чем вас не утсраивает вариант marvellik
  a = list(map(int, ('1', '2')))



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Апрель 12, 2019 13:38:34

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбор функции map

PEHDOM
а зачем вам? чем вас не утсраивает вариант marvellik-а

Во-первых: не устраивает, так как у меня более сложный случай. Надо сохранять все данные в объектах и передавать их из одно map в другой. Конечно я могу передать с помощью list и т.д., но хочу по максимуму все упростить, т.к. трех этажный код получается, а каждый list - это замедление.

Во-вторых: просто хочу разобраться раз и навсегда досконально, как это работает.

Отредактировано first-step (Апрель 12, 2019 13:39:13)

Офлайн

#6 Апрель 12, 2019 15:21:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Разбор функции map

first-step
просто хочу разобраться раз и навсегда досконально, как это работает.
ну как это работает вам уже обьяснили, у итератора из коробки есть только метод next() (__next__()) иретаторы не умеют возвращаться назад..
first-step
Надо сохранять все данные в объектах и передавать их из одно map в другой. Конечно я могу передать с помощью list и т.д., но хочу по максимуму все упростить, т.к. трех этажный код получается, а каждый list - это замедление.
ИМХО чегото вы намудрили с алгоритмом. Думаю там должно все проще быть, но не видя конкретной задачи трудно чтото посоветовать конкретно.

НО если уж так хочеться то itertools.tee() умеет создавать копии итератора, а numpy.nditer() имеет метод reset() позволяющий начать итерацию заново. правда я не уверен что вы чтото выиграете так как использвание tee() или преобразование в nditer() тоже требует затрат.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Апрель 12, 2019 15:38:16

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбор функции map

Задача то простая достаточно. Есть два массива данных:

 [[a1,b1,c1,d1], [a2,b2,c2,d2], [a3,b3,c3,d3], .... ]
в этом массиве все значения int и он формируется через input, т.е. вводится вручную т.е. вводят наборы по 4 циферки. Наборов может быть сколько угодно.
и
 [[1, 3, 4, 5, 6, 1 , 8....], [3, 2, 7, 1, ...], [1, 3, 4, 8, ...] ..... ]
- второй массив состоит из наборов различных перестановок range. Создается с помощью permutations.

Задача отобрать такие комбинации из второго массива, в которых положение циферок соответствует порядку всех элементом первого массива.

т.е. есть в первом массиве
[[1, 3, 5, 7] , [1, 2, 5, 6] [3, 5, 7, 6]]
то для этого случая подойдет комбинация:
 [9, 1, 4, 2, 3, 5, 8, 7, 6]
- как вариант

С помощью фильтров и техэтажных map я это сделал. Просто хочу с минимальными List это сделать.
Нельзя использоватаь нельзя if while for и проч

Отредактировано first-step (Апрель 12, 2019 15:42:43)

Офлайн

#8 Апрель 12, 2019 17:07:10

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Разбор функции map

first-step
в этом массиве все значения int и он формируется через input, т.е
тогда зачем вам map особенно как в вашем примере
 a = map(int, (1, 2))
преобразование типа int к типу int ?

Офлайн

#9 Апрель 12, 2019 17:11:42

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Разбор функции map

first-step
Задача отобрать такие комбинации из второго массива, в которых положение циферок соответствует порядку всех элементом первого массива.
т.е. есть в первом массиве
[[1, 3, 5, 7] , [1, 2, 5, 6] [3, 5, 7, 6]]

то для этого случая подойдет комбинация:

 [9, 1, 4, 2, 3, 5, 8, 7, 6]
м-м-м честно весь мозг себе сломал но никак не могу понять что собственно надо, что означает “положение циферок соответствует порядку всех элементом первого массива”
вот в этом примере совсем непонятно почему 9-ка на первом месте, единица на втором и тд..

first-step
Нельзя использоватаь нельзя if while for и проч
это какоето тестовое задание? нельзя использовать условные операторы и циклы или еще чтото?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#10 Апрель 12, 2019 19:11:45

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Разбор функции map

marvellik
тогда зачем вам map особенно как в вашем примере
Это просто так. Чтобы понять, как map работает

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version