Изменить список наборов, содержащих наборы в Python3 - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь создать список с кортежами в качестве элементов. Каждый кортеж имеет 4 целых числа. Первые 2 целых числа являются результатом сложения 2 ranges, а 2 других из двух разных.

Я использую этот код для создания кортежей и окончательного списка, который получен из декартового произведения. , как видно здесь: Получить декартово произведение ряда списков?

import itertools
first_range = list(zip((10**exp for exp in range(0,7)),(10**exp for exp in range(1,8))))
second_range = list(zip((5*10**exp if exp != 1 else 10**2 for exp in range(1,8)),(5*10**exp for exp in range(2,9))))
final_list = list(itertools.product(first_range,second_range))

Проблема с этим кодом заключается в том, что конечные результаты выглядят так:

[((1, 10), (100, 500)), ((1, 10), (500, 5000)), ((1, 10), (5000, 50000)), ((1, 10), (50000, 500000)), ((1, 10), (500000, 5000000)), ((1, 10), (5000000, 50000000)), ...

Где каждый элемент списка является кортежем, содержащим 2 других кортежа, в то время как я хочу вот что:

[(1, 10, 100, 500), (1, 10, 500, 5000), (1, 10, 5000, 50000), (1, 10, 50000, 500000), (1, 10, 500000, 5000000), (1, 10, 5000000, 50000000), ...

т.е. каждый элемент списка является кортежем, содержащим 4 целых числа.

Любые идеи будет оценена. Должен работать на python3. РЕДАКТИРОВАТЬ: Обновлены нерабочие части кода благодаря комментариям ShadowRanger

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Итак, я был уверен, что был близок к ответу, как только отправил этот вопрос, но я не осознавал, что был так близко. Способ устранения проблемы с дополнительными кортежами:

import itertools
first_range = zip((10**exp for exp in range(7)),(10**exp for exp in range(1,8)))
second_range = zip((5*10**exp if exp != 1 else 10**2 for exp in range(1,8)),(5*10**exp for exp in range(2,9)))
iterator_of_tuples = itertools.product(first_range,second_range)

# the next line solves my issue
final_list = [x + y for x, y in iterator_of_tuples]

Я сделал простое объединение кортежей: Как объединить два кортежа в Python? . Не уверен, почему я не подумал об этом раньше

Редактировать: Обновлен ответ на основе ввода ShadowRanger

0 голосов
/ 04 марта 2020

Ваш ожидаемый результат не является декартовым произведением двух диапазонов.

Если вы хотите, чтобы ваш ожидаемый результат работал примерно так:

final_list = [(*x, *y) for x, y in zip(first_range, second_range)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...