У меня есть список кортежей, и внутри этого кортежа у меня есть 2 списка. Это выглядит примерно так:
value=[(['55', '56', '57', '58', '2'], ['59', '60', '61', '62', '2']), (['63', '64', '65', '66', '2'], ['51', '52', '53', '54', '2'])]
Из двух списков каждого кортежа я хочу создать список, который также будет иметь одинаковую длину (в приведенном выше примере длину 5), и я хочу сделать это для каждого кортежа во внешнем списке. Например, в приведенном выше примере первое значение первого конечного списка будет либо 55, либо 59, второе значение конечного списка будет либо 56, либо 60 и так далее.
Одним из возможных результатов будет:
['59', '60', '57', '58', '2']
и ['63', '52', '53', '66', '2']
Как мне это сделать?
Каждый кортеж внутри values
содержит два списка. Первый список имеет индекс 0, второй список имеет индекс 1.
Мы можем использовать random.randint(0, 1)
для генерации двоичного выбора, либо 0, либо 1, который будет индексом списка, в котором мы выбираем элемент.
import random
res = [[v[random.randint(0, 1)][k] for k in range(len(v[0]))] for v in value]
Давайте разберем синтаксис понимания списка:
value
, с помощью for v in value
.for k in range(len(v[0]))
мы перебираем количество элементов первого списка каждого кортежа (первый или второй здесь не имеет значения, так как оба списка имеют одинаковое количество элементов).v[random.randint(0, 1)][k]
мы случайным образом выбираем первый или второй список и из этого списка извлекаем k-е значение.Можете ли вы объяснить немного, пожалуйста!
Готово, прочитайте обновленный ответ.
Да, теперь я правильно понял код. Спасибо!
Вы можете использовать zip()
с оператором распаковки, чтобы получить варианты для каждой позиции в подсписке, а затем использовать понимание списка, чтобы выполнить эту операцию для каждого кортежа в исходном списке. Примечательно, что использование распаковки делает эту операцию расширяемой, если у вас есть переменное количество списков внутри каждого кортежа:
import random
[[random.choice(choices) for choices in zip(*item)] for item in value]
С заданными данными вы получите вывод, например:
[['55', '60', '61', '62', '2'], ['51', '52', '65', '66', '2']]