Python定义无法使用列表推导

时间:2017-10-03 17:21:27

标签: python function list-comprehension

我正在使用python为Udacity课程编写扑克程序。我正在使用的其中一个定义是我在课程中使用的以下内容。

def card_ranks(cards):
"Return a list of the ranks, sorted with higher first."
    ranks = ['--23456789TJQKA'.index(r) for r,s in cards]
    ranks.sort(reverse=True)
    return ranks

所以这意味着例如cards_ranks([TH,9C,9D,7S])应该返回[10,9,9,7]。但是我收到以下错误

ValueError                                Traceback (most recent call 
last)
<ipython-input-13-ff8fb242bb41> in <module>()
----> 1 card_ranks(['9H','8C','7C','10D'])

<ipython-input-12-7eaf1ab781bc> in card_ranks(cards)
      1 def card_ranks(cards):
      2     "Return a list of the ranks, sorted with higher first."
----> 3     ranks = ['--23456789TJQKA'.index(r) for r,s in cards]
      4     ranks.sort(reverse=True)
      5     return ranks

ValueError: too many values to unpack

有谁知道如何修复它?顺便说一下,我是列表理解的新手,我确实试过以下自己,如果只使用卡片中的数字,则可以使用

def card_ranks(cards):
    "Return a list of the ranks, sorted with higher first."
    ranks = [r[0] for r in cards]
    ranks.sort(reverse=True)
    return ranks

很自然地我尝试了

def card_ranks(cards):
        "Return a list of the ranks, sorted with higher first."
         ranks = ['--23456789TJQKA'.index(r[0]) for r in cards]
         ranks.sort(reverse=True)
         return ranks    

但那也行不通。我真的很感激任何帮助,代码是有效的,但是当我使用它时它不会。我正在使用Jupyter笔记本。

3 个答案:

答案 0 :(得分:3)

'10D'是一个包含三个字符的序列,这些字符值过多,无法解压缩到r,s

如果您改用'TD',它应该有用。

答案 1 :(得分:1)

你做的最后一个代码是对的。但是你有一个小错误。 看起来你有&#39; 10D&#39;卡。因此,当您执行r[0]时,您会得到“1&#39;”。 但是你的索引字符串中没有这种情况。所以'--23456789...'.index(r[0])会引发异常。

正确的代码将是这样的*:

def card_ranks(cards):
    "Return a list of the ranks, sorted with higher first."
     ranks = ['--234567891TJQKA'.index(r[0]) for r in cards]
     ranks.sort(reverse=True)
     return ranks 

*(取决于哪个索引应该有10张卡和哪张卡(T,J,Q,K,A)

答案 2 :(得分:1)

您正试图将unpack变为太少的变量。

list comprehension

ranks = ['--23456789TJQKA'.index(r) for r,s in cards]

card cards r s变量variablesa, b = "xy" 。为简化此操作,您只需以相同的方式分配a

'x'

现在bycard持有list

但是,您的问题来自10Dunpack中的最后一个card。您正尝试3 chars 2 a, b = "10D" ValueError仅变ValueError: too many values to unpack (expected 2) 个变量。这可以再次简化为尝试:

error

会抛出相同的TD

10D

当你明白你想要让计算机做什么时,它实际上是完全有意义的。

要修复此unpacked,只需将卡片值传递为2而不是r,这样就可以将s正确地传入r, s = "TD" # r <-- "T" # s <-- "D" 变量:errorfunction

npm install npm@4.2.0 -g

这应该摆脱你的this.todayDate = new Date(); this.dateToday = (this.todayDate.getFullYear() + '-' + ((this.todayDate.getMonth() + 1)) + '-' + this.todayDate.getDate() + ' ' +this.todayDate.getHours() + ':' + this.todayDate.getMinutes()+ ':' + this.todayDate.getSeconds()); console.log('today date', this.dateToday); 将正确输出。的:)