, а не список.

от вопрос уже есть ответ, здесь:

Перебор двух списков один за другим 3 ответа

В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'

Это моя проблема.

 Josh26 нояб. 2017 г., 20:07
@schwobaseggl В этой строке выдается ошибка типа: «Ошибка типа: неподдерживаемый тип (ы) операнда для +: 'диапазон' и" список ""
 Josh26 нояб. 2017 г., 20:04
@timgeb В этом примере я пытаюсь сделать стандартную колоду из 52 карт. Проблема в том, что я хочу перебирать {"J", "Q", "K", "A"} сразу после пронумерованных карт без необходимости повторения цикла.
 Elis Byberi26 нояб. 2017 г., 20:24
@Joshrange() не создает список в Python 3. Он используется для создания списка в Python 2.range() в Python 3 действительно создаеттип неизменяемой последовательности, а не список.
 timgeb26 нояб. 2017 г., 20:02
Ваш пример неясен. Каков ожидаемый результат / выход?

Ответы на вопрос(5)

что вы хотите, но я обычно предпочитаю представлять карточки в виде двухсимвольной строки:

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

Это более читабельно, на мой взгляд, и все еще будет вести себя как кортеж ранга, масти.

 schwobaseggl26 нояб. 2017 г., 20:24
Нет необходимости в*
Решение Вопроса

range не возвращаетlist в Python3, такrange(2, 10) + ["J", "Q", "K", "A"] не работает, ноlist(range(2, 10)) + ["J", "Q", "K", "A"] делает. Вы также можете использоватьitertools.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"
]

Вложенное понимание, конечно, представляет собой декартово произведение, которое вы также можете использовать для:

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

Ошибка типа: неподдерживаемые типы операндов для +: «диапазон» и «список»

Я дам вам объяснение.

Ваш текущий код работает в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() потому чтоrange() в Python 3 действительно создает тип неизменяемой последовательности, а не список.

Проблема с вашим текущим кодом здесь:

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"]]

Я думаю, что это даст вам желаемый результат (сначала все не-лицевые карты, затем все лицевые карты).

 Jack Aidley26 нояб. 2017 г., 22:12
Это будет работать, но у @schwobaseggl есть лучшее решение, использующее itertools, поскольку оно не требует ненужного построения списка, а затем объединения списков.

deck = [(value, suit) for value in [*range(2, 10), "J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]]
 Ajax123426 нояб. 2017 г., 20:36
@MarkDickinson приятно знать. Пожалуйста, смотрите мои последние изменения.
 Mark Dickinson26 нояб. 2017 г., 20:16
Нет необходимости вlist позвоните туда:[*range(2, 10), "J", "Q", "K", "A"] достаточно. (Или даже[*range(2, 11), *"JQKA"].)

Ваш ответ на вопрос