如何用一个循环顺序循环多个列表? [复制]
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'” @Joshrange()
不会在 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 循环列表的递归以获得组合? [复制]