Понимание списка Python для добавления

#python #list-comprehension

#python #понимание списка

Вопрос:

Я новичок в Python и не могу преобразовать функцию в понимание списка. Понимание включает в себя value функцию, содержащий класс которой выглядит следующим образом:

 class Card(object):

    # Lists containing valid candidates for a card's rank and suit.
    suits = [None, "spade", "club", "heart", "diamond"]
    ranks = [None, "ace", "two", "three", "four", "five", "six", 
             "seven", "eight", "nine", "ten", "jack", "queen", "king"]

    # Dictionary containing the ranks and their associative values.
    values = {None:0, "ace":1, "two":2, "three":3, "four":4,
              "five":5,"six":6,"seven":7, "eight":8,"nine":9,
              "ten":10, "jack":10, "queen":10, "king":10}

    def __init__(self, rank=None, suit=None):
        """Constructor."""
        if rank not in self.ranks:
            raise ValueError("Invalid rank.")
        if suit not in self.suits:
            raise ValueError("Invalid suit.")
        self.rank = rank
        self.suit = suit

    def __str__(self):
        """A string representation of the Card."""
        return "{0}:{1}".format(self.rank, self.suit)
  

Другой класс создает список объектов Card и определяет следующую функцию:

 def value(self):
    """Returns an int value containing the summed values of the hand's cards."""
    result = 0
    for card in self.cards:
        result  = Card.values[card.rank]
    return result
  

Из того, что я вижу, value функция является кандидатом для понимания списка, но я не могу заставить ее работать. Я считаю, что следующее было бы правильным, но я продолжаю получать синтаксические ошибки, я понятия не имею, что я делаю не так. Пожалуйста, обратите внимание, что я новичок в понимании Python и списков:

 def value(self):
    result = [x  = y for x = Card.values[y.rank] for y in self.cards]
  

Ответ №1:

Вы можете просто использовать sum функцию и выражение генератора, подобное этому

 def value(self):
    return sum(Card.values[card.rank] for card in self.cards)
  

Если вы хотите использовать понимание списка, то вы можете просто преобразовать выражение генератора с синтаксисом понимания списка, например

 def value(self):
    return sum([Card.values[card.rank] for card in self.cards])
  

Комментарии:

1. Это фантастика, это работает отлично и кажется лучше, чем использование понимания списка в данном случае. Ради меня самого, не могли бы вы также показать мне, как это будет сделано в виде понимания списка?

2. @Cristian Понимание списка предназначено для создания списка, но вы просто пытаетесь суммировать значения.

3. Просто хотел добавить ясности на основе первого комментария. Вы используете понимание списка: это список внутри sum. Sum просто добавляет компоненты списка, понимание списка возвращает список.