首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用zip实现嵌套列表理解的映射等价

使用zip实现嵌套列表理解的映射等价
EN

Stack Overflow用户
提问于 2016-06-13 18:17:53
回答 3查看 96关注 0票数 0

下面,我有一个id列表和要为每个id创建的urls数量列表,使用url_str作为创建urls的基础。因此,对于id id2,我希望有三个urls。我用list comprehension实现了这一点,这似乎是解决问题最重要的一种方式。

然而,我目前正在学习python,我对与列表理解等价的map很好奇。

代码语言:javascript
复制
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']

最理想的情况是,我会有这样的效果:

代码语言:javascript
复制
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的部分。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-13 18:49:11

请记住,如果要将函数映射到序列的每个元素,例如:

代码语言:javascript
复制
map(func, seq)

相当于:

代码语言:javascript
复制
[func(x) for x in seq]

尽管在python3中,map返回一个迭代器,因此它更接近带有圆括号的(func(x) for x in seq),以指示生成器。

列表理解带来了额外的好处,即能够使用表达式以及/而不是可调用。

例如,如果要在列表的每个元素中添加一个(+1),可以这样做:

代码语言:javascript
复制
[x + 1 for x in seq]

若要使用map重写此代码,您需要创建一个可调用的,将其添加到参数中:

代码语言:javascript
复制
map(lambda x:x+1, seq)

此外,在列表理解中使用多个变量也相当简单:

代码语言:javascript
复制
[x+y for x,y in itertools.product(range(5), range(7))]

但是map的可调用性只需要使用一个参数,因此需要使用元组将元素打包在一起:

代码语言:javascript
复制
map((lambda pair: pair[0] + pair[1]), itertools.product(range(5),range(7)))

您的情况更容易混淆,因为序列只使用嵌套的for循环构建,因此您很可能最终会对序列使用生成器表达式:

代码语言:javascript
复制
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的目的,我建议您坚持理解列表,因为它是适合您的工作的工具。

票数 2
EN

Stack Overflow用户

发布于 2016-06-13 18:44:23

我不认为map在这里会有很好的效果,但在我放弃它之后,我至少能够将您的列表简化为更易读、更有效率的内容:

代码语言:javascript
复制
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']
票数 1
EN

Stack Overflow用户

发布于 2016-06-13 18:35:59

我不想删除这个问题,因为有人能够在上面的评论中回答我的问题。

代码语言:javascript
复制
 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)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37796601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档