【问题标题】:How to loop through multiple lists sequentially with one loop? [duplicate]如何用一个循环顺序循环多个列表? [复制]
【发布时间】:2018-05-10 00:56:15
【问题描述】:

Python 3.6.3 中,有没有办法在一个接一个的列表中循环?

例如:

deck = [(value, suit) for value in range(2, 11) +
            ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]

(在这种情况下,我想在非面卡之后循环遍历面卡。)

为了澄清: 上面的行抛出一个:

TypeError: unsupported operand type(s) for +: 'range' and 'list'

这是我的问题。

【问题讨论】:

  • 你的例子不清楚。预期的结果/输出是什么?
  • @timgeb 在示例中,我尝试制作一副标准的 52 张卡片。问题是我想在编号卡片之后立即迭代 {"J", "Q", "K", "A"} 而不需要第二次循环。
  • @schwobaseggl 此行引发类型错误:“TypeError: unsupported operand type(s) for +: 'range' and 'list'”
  • @Josh range() 不会在 Python 3 中创建列表。它曾经在 Python 2 中创建列表。range() 在 Python 3 中确实创建了不可变序列类型,不是列表。

标签: python python-3.x loops


【解决方案1】:

range 在 Python3 中不返回 list,因此 range(2, 10) + ["J", "Q", "K", "A"] 不起作用,但 list(range(2, 10)) + ["J", "Q", "K", "A"] 可以。您还可以使用itertools.chain 连接可迭代对象:

from itertools import chain 

chain(range(2, 10), ["J", "Q", "K", "A"])
# or even shorter:
chain(range(2, 10), "JQKA")  # as strings themselves are iterables

# so this comprehension will work
deck = [
   (value, suit) 
   for value in chain(range(2, 10), "JQKA") 
   for suit in "HCDS"
]

当然,嵌套推导确实构成了一个笛卡尔积,您也可以使用 util:

from itertools import product
deck = list(product(chain(range(2, 10), "JQKA"), "HCDS"))

【讨论】:

    【解决方案2】:

    您当前代码的问题在这里:

    range(2, 10) + ["J", "Q", "K", "A"]
    

    首先应该是range(2, 11),否则会省略编号为10的卡片。其次,为了加入范围和列表,您必须这样做:

    list(range(2, 11)) + ["J", "Q", "K", "A"]
    

    所以最终的结果是:

    deck = [(value, suit) for value in list(range(2, 11)) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]
    

    我认为这将为您提供所需的输出(首先是所有非人脸卡,然后是所有人脸卡)。

    【讨论】:

    • 这可行,但@schwobaseggl 使用 itertools 有更好的解决方案,因为它不需要不必要地构造列表,然后进行列表连接。
    【解决方案3】:

    请参阅@schwobaseggl 的解决方案,但我通常更喜欢将卡片表示为 2 个字符的字符串:

    deck = [r+s for r in '23456789TJQKA' for s in 'hcds']
    

    在我看来,这更具可读性,并且仍然很像等级元组,西装。

    【讨论】:

    • 不需要*
    【解决方案4】:

    在Python3中,可以使用解包:

    deck = [(value, suit) for value in [*range(2, 10), "J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]
    

    【讨论】:

    • 那里不需要list 呼叫:[*range(2, 10), "J", "Q", "K", "A"] 就足够了。 (甚至[*range(2, 11), *"JQKA"]。)
    • @MarkDickinson 很高兴知道。请查看我最近的编辑。
    【解决方案5】:

    只关注你得到的错误:

    TypeError:+ 的不支持的操作数类型:“范围”和“列表”

    我会给你一个解释。

    您当前的代码在 Python 2 中工作:

    deck = [(value, suit) for value in range(2, 11) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]
    print deck
    

    将打印:

    [(2, 'H'), (2, 'C'), (2, 'D'), (2, 'S'), (3, 'H'), (3, 'C'), (3, 'D'), (3, 'S'), (4, 'H'), (4, 'C'), (4, 'D'), (4, 'S'), (5, 'H'), (5, 'C'), (5, 'D'), (5, 'S'), (6, 'H'), (6, 'C'), (6, 'D'), (6, 'S'), (7, 'H'), (7, 'C'), (7, 'D'), (7, 'S'), (8, 'H'), (8, 'C'), (8, 'D'), (8, 'S'), (9, 'H'), (9, 'C'), (9, 'D'), (9, 'S'), (10, 'H'), (10, 'C'), (10, 'D'), (10, 'S'), ('J', 'H'), ('J', 'C'), ('J', 'D'), ('J', 'S'), ('Q', 'H'), ('Q', 'C'), ('Q', 'D'), ('Q', 'S'), ('K', 'H'), ('K', 'C'), ('K', 'D'), ('K', 'S'), ('A', 'H'), ('A', 'C'), ('A', 'D'), ('A', 'S')]
    

    Python 3 中,您必须使用 list(range(2, 11))

    deck = [(value, suit) for value in list(range(2, 11)) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]
    print(deck)
    

    将打印:

    [(2, 'H'), (2, 'C'), (2, 'D'), (2, 'S'), (3, 'H'), (3, 'C'), (3, 'D'), (3, 'S'), (4, 'H'), (4, 'C'), (4, 'D'), (4, 'S'), (5, 'H'), (5, 'C'), (5, 'D'), (5, 'S'), (6, 'H'), (6, 'C'), (6, 'D'), (6, 'S'), (7, 'H'), (7, 'C'), (7, 'D'), (7, 'S'), (8, 'H'), (8, 'C'), (8, 'D'), (8, 'S'), (9, 'H'), (9, 'C'), (9, 'D'), (9, 'S'), (10, 'H'), (10, 'C'), (10, 'D'), (10, 'S'), ('J', 'H'), ('J', 'C'), ('J', 'D'), ('J', 'S'), ('Q', 'H'), ('Q', 'C'), ('Q', 'D'), ('Q', 'S'), ('K', 'H'), ('K', 'C'), ('K', 'D'), ('K', 'S'), ('A', 'H'), ('A', 'C'), ('A', 'D'), ('A', 'S')]
    

    您必须使用 list(),因为 Python 3 中的 range() 确实创建了不可变序列类型,而不是列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多