为什么这个列表理解不起作用

时间:2016-11-06 16:50:04

标签: python list-comprehension python-3.5

我正在找一个可以告诉我为什么这个列表理解不起作用的人

new_cards = [p if usr_card in deck1
         else p if usr_card in deck2
         else 'Removed' for p in cards]

cards是这样的列表列表>> cards = [ [deck1], [deck2] ] user_cards是一个项目,可以存在于其中一个套牌deck1deck2中,如果不是我想在该索引中生成该项目,则删除'串

但问题是,即使其中一个牌组中存在usr_card,它就会被移除'

3 个答案:

答案 0 :(得分:1)

重写此内容以清楚显示内联if语句并稍微折叠逻辑:

new_cards = [
    (p
     if usr_card in deck1
     or usr_card in deck2
     else 'Removed')
    for p in cards
]

这相当于:

if usr_card in deck1 or usr_card in deck2:
    new_cards = [p for p in cards]
else:
    new_cards = ['Removed'] * len(cards)

我不认为这就是你想要的。

也许您正在寻找迭代每个子卡片作为移除卡片?

new_cards = [
    [(card if card in deck1+deck2 else 'Removed') for card in deck]
    for deck in cards
]

创建列表推导的一般提示

不幸的是,我并不确定每个变量代表什么或预期输出是什么,所以我无法准确地说出你想要完成的事情。

I recommend copy-pasting your way into a list comprehension ,当您正在学习时。这是我在弄清楚如何编写它们时遇到的方法。

答案 1 :(得分:0)

如上所述,您的代码返回:

  • [[deck1],[deck2]]
  • 或['已删除','已删除']

取决于usr_card是否在卡片中。

那是因为p迭代了卡片的元素。卡片只有两个元素:deck1和deck2。

看起来,但你的要求并不清楚,你想要处理甲板的连接。

cards = deck1 + deck2

此外,根据定义,永远不会打印已删除,如果usr_card不在卡片中,则该项目不能被标记。

请更清楚您的业务规则是什么。

答案 2 :(得分:0)

new_cards = [p if p in usr_card else 'removed' for deck in cards for p in deck]应该这样做,虽然可能需要稍微调整一下,具体取决于您的代码究竟发生了什么,我不太清楚。