如何用一个循环顺序循环多个列表? [复制]

Posted

技术标签:

【中文标题】如何用一个循环顺序循环多个列表? [复制]【英文标题】: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 中确实创建了不可变序列类型,不是列表。 【参考方案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() 确实创建了不可变序列类型,而不是列表。

【讨论】:

以上是关于如何用一个循环顺序循环多个列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何用Python生成多个随机矩阵

如何用for循环遍历PHP中以0开头的数字? [复制]

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

python如何用循环生成列表,把[0,1,2,3] 变成[1,2,3,4]

c#或java如何用循环定义多个变量

如何用变量名添加数字? [复制]