Булевы операторы не работают согласованно. Печатает "а" правильно, но печатает "б" неправильно

Итак, я хочу написать эту программу, в которой я определяю класс, а метод внутри него принимает список цветов в качестве аргумента. Цвета "красный", "красный", "зеленый" и "зеленый" следует заменить на "черный", "черный", "белый" и "белый" (см. Словарь "self.colour_replacement" в кодовом тексте),

Если в списке присутствует только один из двух цветов, красный / зеленый, независимо от заглавной буквы, программа должна возвращать список только без его изменения.

Example_1:
print(c.make_readable(['Green', 'Green', 'pink', 'green', 'yellow', 'green', 
'green']))

should return: 
['Green', 'Green', 'pink', 'green', 'yellow', 'green', 'green']


Example_2: 
print(c.make_readable(['green', 'Green']))

should return:
['green', 'Green']

Я думаю, что проблема связана с моими "или" и "и" утверждениями в строке:

if ('red' and 'green') in colours or ('Red' and 'green') in colours or 
('red' and 'Green') in colours or ('Red' and 'Green') in colours:  

но я не совсем уверен.

class ColourChanger:
    def __init__(self):
    """A dictionary that shows the 
    replacement colours."""
        self.colour_replacement = {'Green' : 'White', 'red': 'black', 
    'green': 'white', 'Red' : 'Black'}

    def make_readable(self, colours):
        result = []    
        if ('red' and 'green') in colours or ('Red' and 'green') in colours or 
        ('red' and 'Green') in colours or ('Red' and 'Green') in colours:
            for col in colours:
                if col in self.colour_replacement:
                    result.append(self.colour_replacement[col]) """Appends the 
                   "result"-list with the replacement color instead of the color (col)."""
                else:
                    result.append(col)

        else:
            return colours

        return result


c = ColourChanger()
print(c.make_readable(['green', 'Green']))
print(c.make_readable(['Red', 'red']))
print(c.make_readable(['Red', 'Red', 'pink', 'red', 'yellow', 'red', 'red', 
'Green']))
print(c.make_readable(['Green', 'Green', 'pink', 'green', 'yellow', 'green', 
'green']))


Expected output:
['green', 'Green']
['Red', 'red']
['Black', 'Black', 'pink', 'black', 'yellow', 'black', 'black', 'White']
['Green', 'Green', 'pink', 'green', 'yellow', 'green', 'green']

Actual Output: 
['white', 'White']
['Red', 'red']
['Black', 'Black', 'pink', 'black', 'yellow', 'black', 'black', 'White']
['White', 'White', 'pink', 'white', 'yellow', 'white', 'white']

1 ответ

Ваше состояние не так, чтобы исправить это использовать

if ('red' in colours and 'green' in colours) or ( ...)  .... : 

но это не нужно - так много делится на обмане.


Вы можете избежать большинства ваших ifвсе вместе. Существует очень мало преимуществ сначала проверить, есть ли что-то в списке, а затем условно построить замену, чтобы вернуть ее. Иногда вы можете не создавать список замены, что может быть полезно, если ваши списки огромны, но вам все равно придется повторять каждый список по всей его длине, чтобы "увидеть" это. Вы также должны будете сделать это для всех списков, которые должны были бы получить замещающий список, который будет создан, - вы будете проходить его более одного раза - съедая все "время", которое вы сэкономили, для тех, которые не нуждаются в заменах. Для коротких списков (ish) проще просто создать замену каждый раз:

Проще построить "замену" при первом запуске ваших данных:

class ColourChanger:
    def __init__(self):
        # A dictionary that shows the replacement colours - only lowercase needed
        self.colour_replacement = {'green' : 'white', 'red': 'black'}

    def make_readable(self, colours):
        result = []

        # iterate all col's, append them if not in dict, else append the replacement
        for col in colours:
            replace = self.colour_replacement.get(col.lower(), col)

            # adjust case-ness by string-splicing with uppercase where needed
            if col[0].isupper() and replace[0].islower(): 
                replace = replace[0].upper()+replace[1:]

            result.append(replace)

        return result



c = ColourChanger()
print(c.make_readable(['green', 'Green']))
print(c.make_readable(['Red', 'red']))
print(c.make_readable(['Red', 'Red', 'pink', 'red', 'yellow', 'red', 'red', 
'Green']))
print(c.make_readable(['Green', 'Green', 'pink', 'green', 'yellow', 'green', 
'green']))

Выход:

['white', 'White']
['Black', 'black']
['Black', 'Black', 'pink', 'black', 'yellow', 'black', 'black', 'White']
['White', 'White', 'pink', 'white', 'yellow', 'white', 'white']

См. Почему dict.get (ключ) вместо dict[ключ]? зачем использовать .get(key, default),

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