2016-06-13 2 views
0

Ниже приведен список идентификаторов и список количества URL-адресов, создаваемых для каждого идентификатора, с использованием url_str в качестве базы созданных URL-адресов. Итак, для id id2, я бы ожидал три URL-адреса. Я выполнил это с помощью list comprehension, который, по-видимому, является самым питоническим способом решения проблемы.Карта эквивалента вложенного списка с использованием zip

Тем не менее, я изучаю python в данный момент, и мне интересно узнать об map, эквивалентном пониманию списка.

url_str = "www.amazon.com/gp/cdp/member-reviews/" 
ids = ['id' + str(x) for x in xrange(1, 5)] 
revs = [1, 3, 1, 8] 

# ids output 
['id1', 'id2', 'id3', 'id4'] 


# list comprehension 
urls_compr = [url_str + id_r + "page=" + str(x) 
       for id_r, page in zip(ids, revs) 
       for x in xrange(1, page + 1)] 



# output of list comprehension 
['www.amazon.com/gp/cdp/member-reviews/id1page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2page=2', 
'www.amazon.com/gp/cdp/member-reviews/id2page=3', 
'www.amazon.com/gp/cdp/member-reviews/id3page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4page=2', 
'www.amazon.com/gp/cdp/member-reviews/id4page=3', 
'www.amazon.com/gp/cdp/member-reviews/id4page=4', 
'www.amazon.com/gp/cdp/member-reviews/id4page=5', 
'www.amazon.com/gp/cdp/member-reviews/id4page=6', 
'www.amazon.com/gp/cdp/member-reviews/id4page=7', 
'www.amazon.com/gp/cdp/member-reviews/id4page=8'] 

В идеале, я бы что-то эффект:

urls_map = map(func, ids, revs) 

urls_map 
['www.amazon.com/gp/cdp/member-reviews/id1page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2page=2', 
'www.amazon.com/gp/cdp/member-reviews/id2page=3', 
'www.amazon.com/gp/cdp/member-reviews/id3page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4page=2', 
'www.amazon.com/gp/cdp/member-reviews/id4page=3', 
'www.amazon.com/gp/cdp/member-reviews/id4page=4', 
'www.amazon.com/gp/cdp/member-reviews/id4page=5', 
'www.amazon.com/gp/cdp/member-reviews/id4page=6', 
'www.amazon.com/gp/cdp/member-reviews/id4page=7', 
'www.amazon.com/gp/cdp/member-reviews/id4page=8'] 

Я просто не уверен в func части.

+1

Теги на этом в замешательстве. Вы говорите, что у вас есть рабочий список comp, который вы опубликовали, и вы хотите переписать его с помощью карты, чтобы получить тот же результат, что и у вас уже есть? (Почему?) –

+0

Я обменивал теги. У меня есть рабочий список comp, но я хочу переписать с помощью карты. Почему? Потому что я новичок в этом языке, и мне любопытно, нет другой причины. –

+1

карта действительно не имеет смысла здесь, она работает только хорошо, когда операция над каждым элементом является вызываемой, например, с использованием 'map (str, seq)' будет равнозначной '[str (x) для x в seq] 'в python 2 или' (str (x) для x в seq) 'в python 3 (list comp vs generator comp), но когда операция типа' url_str + id_r + "page =" + str (x) ', вы бы для реализации этого как функции/лямбда и ... нет, это не правильный инструмент для этой работы. –

ответ

2

Имейте в виду, что map существовали до появления списка понимания, если вы хотите, чтобы отобразить функцию к каждому элементу последовательности, например:

map(func, seq) 

было бы эквивалентно:

[func(x) for x in seq] 

Хотя в Python 3 map возвращает итератор, поэтому было бы ближе к (func(x) for x in seq) с круглыми скобками, чтобы указать генератор.

Пояснение к списку приходит с добавленным бонусом использования выражений, а также/вместо вызовов.

Например, если вы хотите добавить один (+1) к каждому элементу списка вы можете сделать:

[x + 1 for x in seq] 

переписать это с помощью map вам нужно будет создать отзывной, который добавляет один к аргументу :

map(lambda x:x+1, seq) 

Даже дальше, используя несколько переменных в списке понимание достаточно прост:

[x+y for x,y in itertools.product(range(5), range(7))] 

Но вызываемая для map нужд только принимать один аргумент, так что вам нужно будет использовать кортежи, чтобы упаковать элементы вместе:

map((lambda pair: pair[0] + pair[1]), itertools.product(range(5),range(7))) 

Ваш случай еще более склонными к путанице, так как последовательность построен только с вложенными для петель, так что вы будете весьма вероятно, в конечном итоге, используя выражение генератор для последовательности равно:

map((lambda x: x[0] + x[1] + "page=" + str(x[2])), ((url_str, id_r, x) for id_r, page in zip(ids, revs) for x in xrange(1, page + 1))) 

Это явно не то, что map был предназначен для, я рекомендую вам придерживаться списка понимания, так как он является правильным инструментом для вашей работы ,

0

Я не хочу удалять вопрос, потому что кто-то смог ответить на мой вопрос в комментариях выше.

map((lambda x: x[0] + x[1] + "page=" + str(x[2])), ((url_str, id_r, x) for id_r, page in zip(ids, revs) for x in xrange(1, page + 1))) 
+1

Я отвечу в ответ с более подробным объяснением. –

1

Я не думаю, что map будет работать в большой путь здесь, но после того, как я отказался от него, я, по крайней мере в состоянии упростить список вашего Комп в чем-то немного более читаемым и эффективным:

In [31]: ids = xrange(1, 5) 

In [32]: pages = (1, 3, 1, 8) 

In [33]: pages_per_id = zip(ids, pages) 

In [34]: url_str 
Out[34]: 'www.amazon.com/gp/cdp/member-reviews/id%s?page=%s' 

In [35]: [url_str % (id, page_no) for id, pages in pages_per_id for page_no in range(1, pages+1)] 
Out[35]: 
['www.amazon.com/gp/cdp/member-reviews/id1?page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2?page=1', 
'www.amazon.com/gp/cdp/member-reviews/id2?page=2', 
'www.amazon.com/gp/cdp/member-reviews/id2?page=3', 
'www.amazon.com/gp/cdp/member-reviews/id3?page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=1', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=2', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=3', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=4', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=5', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=6', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=7', 
'www.amazon.com/gp/cdp/member-reviews/id4?page=8'] 
Смежные вопросы