Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
174 views
in Technique[技术] by (71.8m points)

Python List Comprehension for Addition

I'm new to Python and cannot convert a function to a list comprehension. The comprehension involves the value function, of which the containing class is as follows:

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)

A different class creates a list of Card objects, and defines the following function:

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

From what I can see, the value function is a candidate for list comprehension, but I cannot get it working. I believe the following would be correct, but I continue to get syntax errors, I have no idea what I'm doing wrong. Please note that I'm new to Python and list comprehensions:

def value(self):
    result = [x += y for x = Card.values[y.rank] for y in self.cards]
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can simply use sum function and a generator expression like this

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

If you want to use list comprehension, then you can simply convert the generator expression with list comprehension syntax, like this

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...