Python объединяет три списка в один в определенном формате

У меня есть три списка, которые я хочу сделать в один список (включая все возможные комбинации 4 для каждой аббревиатуры страны), строка, которая должна быть следующей:

query = f'c_code = {country}&min_age = {age[0]}&max_age = {age[1]}&gender = {gender}'

то есть каждая страна будет иметь 4 строки, я сделал следующие три цикла for, чтобы сделать это, но я считаю, что это не очень pythonic.

country_abb=['ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'CI', 'JM', 'JP', 'JE', 'JO', 'KI', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'NA', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'MP', 'NO', 'OM', 'PK', 'PW']
genders = ['male','female']
ages_range = [[16,25],[26,50]]
all_queries = []
for country in country_abb:
    for gender in genders:
        for age in ages_range:
            query = f'c_code = {country}&min_age = {age[0]}&max_age = {age[1]}&gender = {gender}'
            all_queries.append(query)

@roganjosh дефис в возрастном диапазоне[1]

Smart Manoj 22.06.2019 09:28

@roganjosh Исправлено, ЕСЛИ у меня было - вместо запятой

hadesfv 22.06.2019 09:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать product из itertools. Я не знаю, является ли это более питоническим, но он немного короче, и я нахожу его более читаемым, но я думаю, что ваш пробег может отличаться:

from itertools import product

country_abb=['ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'CI', 'JM', 'JP', 'JE', 'JO', 'KI', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'NA', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'MP', 'NO', 'OM', 'PK', 'PW']
genders = ['male','female']
ages_range = [[16,25],[26,50]]
all_queries = []

for country, gender, age in product(country_abb, genders, ages_range):
    query = f'c_code = {country}&min_age = {age[0]}&max_age = {age[1]}&gender = {gender}'
    all_queries.append(query)

product создает список списка, в котором объединены все элементы исходных списков, что очень похоже на вложенные циклы for в исходном сообщении. Подробнее об этом можно прочитать в документации Python здесь. (Спасибо, @roganjosh, за предложение добавить ссылку.)

что именно делает продукт?

hadesfv 22.06.2019 09:37

Он создает список списка, в котором объединены все элементы исходных списков, что очень похоже на вложенные циклы for в исходном сообщении.

JohanL 22.06.2019 09:40

даст ли это все комбинации, если я добавлю больше age_ranges, например ages_range = [[16,25],[26,50],[0,15],[51,80]]?

hadesfv 22.06.2019 09:44

Да, так же, как и с вложенными for петлями.

JohanL 22.06.2019 09:45

Вы также можете просто использовать list comprehension:

country_abb=['ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'CI', 'JM', 'JP', 'JE', 'JO', 'KI', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MK', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'NA', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'MP', 'NO', 'OM', 'PK', 'PW']
genders = ['male','female']
ages_range = [[16,25],[26,50]]

all_queries = [
    f"c_code = {country}&min_age = {age[0]}&max_age = {age[1]}&gender = {gender}"
    for age in ages_range
    for gender in genders
    for country in country_abb
]

хорошо знать, что это можно сделать в одном понимании списка, но в основном это то же самое, что и мой код

hadesfv 22.06.2019 10:41

@hadesfv да, выглядит лучше, чем вложенный цикл.

LiuXiMin 22.06.2019 10:45

Другие вопросы по теме