2013-08-31 3 views
0

В переменных играх есть список объектов.Python - map() и список объектов

for g in games: 
    if g.clam ==5: g.new_var=1 
    if g.clam ==4: g.new_var=0 

Как получить вышеуказанную функциональность с помощью функции map()? Я пробовал что-то вроде следующего, но я думаю, что это не близко к правильному пути.

def assign_var(clam): 
    if clam==5: return 1 
    if clam==4: return 0 

games.new_var = map(assign_var, games.clam) 
+1

Вы редактируете структуру данных, когда вы перебираете ее. Это не очень хорошая идея. –

+0

@EricUrban Пока элементы не добавляются и не удаляются, редактирование списка должно быть прекрасным. – korylprince

+0

Эрик Я не понимаю вашу точку зрения. ЕСЛИ я делаю это в цикле for, я все еще повторяю его и редактирую. Что мне не хватает? – appleLover

ответ

1

Создать новый атрибут в вашей assign_var функции

>>> 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 ins in games: 
    if ins.clam == 5: 
     instance.new_var = 1 
    elif instance.clam == 4: 
     instance.new_var = 0 

Просто записочку, помните, что разреженным лучше, чем густой;).

+0

«разреженный лучше плотного» +1 - читаемость лучше, чем меньше строк. – korylprince

0

Непонятно, почему вы хотите использовать map() здесь. Если вы мутируете games, достаточно простого for -loop.

map() больше подходит для создания нового list (и даже тогда предпочтительным будет понимание списка).

Я также думаю, что dict является более аккуратным способом определения отображения, поскольку его меньше беспокоит. Это может быть включено в ваш класс Game.

Вот пример:

#!/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 

Пример вывода:

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() в этом примере, но в производстве код, я предпочел бы:

games = [Game(clam) for clam in range(10)] 

Почему? См. The fate of reduce() in Python 3000.

Смежные вопросы