下面,我有一个id列表和要为每个id创建的urls数量列表,使用url_str作为创建urls的基础。因此,对于id id2,我希望有三个urls。我用list comprehension实现了这一点,这似乎是解决问题最重要的一种方式。
然而,我目前正在学习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的部分。
发布于 2016-06-13 18:49:11
请记住,如果要将函数映射到序列的每个元素,例如:
map(func, seq)相当于:
[func(x) for x in seq]尽管在python3中,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)))您的情况更容易混淆,因为序列只使用嵌套的for循环构建,因此您很可能最终会对序列使用生成器表达式:
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的目的,我建议您坚持理解列表,因为它是适合您的工作的工具。
发布于 2016-06-13 18:44:23
我不认为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']发布于 2016-06-13 18:35:59
我不想删除这个问题,因为有人能够在上面的评论中回答我的问题。
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)))https://stackoverflow.com/questions/37796601
复制相似问题