Я пишу программу, которая будет служить генератором идей фотографии для нью-йоркских фотографов. Как это работает сейчас, довольно просто: код использует функцию random.choice для случайного извлечения элементов из списков, а затем код выводит их таким образом, чтобы сформировать предложение на английском языке в качестве конечного результата.

Моя проблема в том, что мне нужно добавить к этому некоторую логику, так как некоторые результаты не имеют смысла для фотографа (по крайней мере, на мой взгляд). В этом примере я пытаюсь удалить «Bracketed (HDR)» из списка techn_list, если «Портрет» выбирается случайным образом, когда python выбирает элемент темы.

У меня ощущение, что я неправильно использую функцию .remove в условном операторе if. Есть лучший способ это сделать? Я приложил соответствующие части кода для проверки.

Я пробовал technilist.remove ('в скобках (HDR)'), а также

Del techn_list [0], оба как часть ответа оператора if.

import random 

print ("You should try taking a...")

#pool of items that the program will randomly choose..
theme_list = ['Cityscape','Peoplescape','Port-Scape', 'Portrait']
technique_list  = ['Bracketed (HDR)','Wide Angle', 'Zoom','Long 
Exposure','Fast Shutter','Daytime Long Expo','Timelapse']


#what we need here are conditional IF statements,  that manipulate items 
from various lists

#this bit of code determines the theme of a photo idea
theme_var = random.choice(theme_list) 
for theme in theme_var:
if theme == 'Portrait':
        technique_list.remove('Bracketed (HDR)') 
print("",theme_var)

#this bit of code determines the technique of a photo idea
technique_var = random.choice(technique_list)
print("", technique_var)

print("picture, from")

#this line of code determines the location of a photo idea
location_var = random.choice(location_list)
print("", location_var) 

Это все еще остается одним из возможных результатов кода:

You should try taking a...
 Portrait
 Bracketed (HDR)
picture, from
 34th Street
during
 Sunrise
and then give it a
 Black & White
edit in Lightroom!
[Finished in 0.2

Как я уже говорил ранее, Portrait и Bracketed (HDR) никогда не должны быть частью одного и того же результата, в этой ситуации это не имеет смысла.

2
brooklynveezy 4 Июл 2019 в 15:18

3 ответа

Лучший ответ

Я пошел бы со словарем неуместных методов, пониманием списка, и закончил бы его f-строкой:

import random 

#pool of items that the program will randomly choose..
theme_list = ['Cityscape','Peoplescape','Port-Scape', 'Portrait']
technique_list  = ['Bracketed (HDR)','Wide Angle', 'Zoom','Long Exposure','Fast 
Shutter','Daytime Long Expo','Timelapse']
location_list = ['34th Street']

# dictionary of inappropriate techniques for given theme
d_inappropes = {'Cityscape': [],
            'Port-Scape': [],
            'Portrait': ['Bracketed (HDR)'],
            'Peoplescape': ['Long Exposure', 'Timelapse', 'Daytime Long Expo']}

#this bit of code determines the theme of a photo idea
theme_var = random.choice(theme_list) 

#this bit of code determines the technique of a photo idea
# list comprehension generates a new list with the inappropriate techniques removed,
# without affecting the original list
technique_var = random.choice([ti for ti in technique_list if ti not in d_inappropes[theme_var]])

#this line of code determines the location of a photo idea
location_var = random.choice(location_list)

# use f-stirngs to put the whole output in a single line to keep it managable 
print(f"You should try taking a \n {theme_var} {technique_var} picture, \n from 
{location_var}.")
0
kingfischer 4 Июл 2019 в 12:46

Проблема (я думаю) в том, что вы перебираете случайно выбранный результат, а не сам список, вам не нужен цикл for, который есть.

theme_var = random.choice(theme_list) 

if theme_var == 'Portrait':
        technique_list.remove('Bracketed (HDR)') 
print("",theme_var)

#this bit of code determines the technique of a photo idea
technique_var = random.choice(technique_list)
print("", technique_var)

print("picture, from")

#rest of the code

Должен сделать это

1
c0smiX42 - Brawl stars 4 Июл 2019 в 12:23

Если я могу добавить и дать больше объяснений на ответы

  1. Вы хотите удалить "Bracked (HDR)", если выбран портрет. Не используйте .remove, так как он навсегда удалит «bracked (HDR)» и помешает другой теме использовать эту технику. Вы можете использовать словарь неуместной техники, как предложил Kingfischer для этого

  2. random.choice вывел одно значение из вашего списка. Вы не должны использовать цикл for с ним, так как цикл for будет перебирать символ / алфавит в значении, выводимом random.choice

  3. если я могу дать отзыв, отступы в вашем фрагменте кода довольно перемешаны. Некоторые строки, которые должны иметь отступы, не имеют его. Я не знаю .. возможно, это непреднамеренно, и проблема с моим браузером. если бы это было так, извините!

0
Michael Chen 4 Июл 2019 в 13:16