首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - map()和对象列表

Python - map()和对象列表
EN

Stack Overflow用户
提问于 2013-08-31 10:59:10
回答 2查看 142关注 0票数 0

在变量游戏中有一个对象列表。

代码语言:javascript
复制
for g in games:
  if g.clam ==5: g.new_var=1
  if g.clam ==4: g.new_var=0

如何使用map()函数获得上述功能?我尝试了下面这样的方法,但我认为它不是正确的方法。

代码语言:javascript
复制
def assign_var(clam):
  if clam==5: return 1
  if clam==4: return 0

games.new_var = map(assign_var, games.clam)
EN

回答 2

Stack Overflow用户

发布于 2013-08-31 11:08:31

assign_var函数中创建新属性

代码语言:javascript
复制
>>> def assign_var(instance):
...     if instance.clam == 5:
...         instance.new_var = 1
...     elif instance.clam == 4:
...         instance.new_var = 0
... 
>>> map(assign_var, games)
[None, None, None] # Intentional. It will modify the list "games" in place.
>>> for ins in games:
...     print ins.new_var
... 
0
1
0

但实际上,这不是map()应该用到的。map()应该用于可以随更改的数据一起返回的列表,而您不能真正使用类的属性。

一个简单的for循环应该完全没问题:

代码语言:javascript
复制
for ins in games:
    if ins.clam == 5:
        instance.new_var = 1
    elif instance.clam == 4:
        instance.new_var = 0

请注意,请记住,稀疏比密集要好;)。

票数 1
EN

Stack Overflow用户

发布于 2013-08-31 14:20:54

现在还不清楚你为什么要在这里使用map()。如果您要对games进行突变,那么一个简单的for-loop就足够了。

map()更适合于创建新的list (即使这样,列表理解也会更好)。

我还认为dict是定义映射的一种更简洁的方式,因为它维护起来不那么麻烦。这可以包含在您的Game类中。

下面是一个示例:

代码语言:javascript
复制
#!/usr/bin/env python


class Game(object):
    clam_to_new_var = {
        4: 0,
        5: 1,
    }

    def __init__(self, clam):
        self.clam = clam

    @property
    def new_var(self):
        return Game.clam_to_new_var.get(self.clam, None)

    def __str__(self):
        return 'Game with clam "{}" has new_var "{}"'.format(
            self.clam,
            self.new_var,
        )

if __name__ == '__main__':
    games = map(Game, xrange(10))
    for g in games:
        print g

示例输出:

代码语言:javascript
复制
Game with clam "0" has new_var "None"
Game with clam "1" has new_var "None"
Game with clam "2" has new_var "None"
Game with clam "3" has new_var "None"
Game with clam "4" has new_var "0"
Game with clam "5" has new_var "1"
Game with clam "6" has new_var "None"
Game with clam "7" has new_var "None"
Game with clam "8" has new_var "None"
Game with clam "9" has new_var "None"

我在该示例中保留了map(),但在生产代码中,我更倾向于:

代码语言:javascript
复制
games = [Game(clam) for clam in range(10)]

为什么?参见The fate of reduce() in Python 3000

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18544036

复制
相关文章

相似问题

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