Нужно написать функцию, которая получает список цветов и выводит их отрицательные цвета (пары из dict) - PullRequest
1 голос
/ 04 ноября 2019

Я сделал это, используя понимание списка, но мой код никоим образом не удовлетворяет. Как сделать его короче и эффективнее? Обратите внимание, что я не могу изменить диктовку cols, и было бы неплохо не использовать какие-либо библиотеки.

def RevertCol(L):
    cols = {'white': 'black', 'red' : 'green', 'yellow': 'blue'}
    negative = []
    keys = cols.keys()
    values = cols.items()

    for col in L:
        if col in keys:
            negative.append(cols.get(col))
        else:
            for m, t in values:
                if t == col:
                    negative.append(m)
    return negative

in:

RevertCol(['red', 'white']) 

out:

['green', 'black']

Ответы [ 4 ]

1 голос
/ 04 ноября 2019

Чтобы сделать ваш метод более быстрым и легким для чтения, вы можете хранить все цветовые отрицания на одной карте

def RevertCol(L):
    cols = [('white', 'black'), ('red', 'green'), ('yellow', 'blue')]
    col_to_negative = {}
    col_to_negative.update(cols)
    col_to_negative.update((value, key) for key, value in cols)

    return [col_to_negative[col] for col in L]

Вы также можете предварительно вычислить col_to_negative один раз, а затем использовать его при каждом вызове

1 голос
/ 04 ноября 2019

Есть ли причина, по которой не все цвета являются ключами к диктовке? Например:

cols = {'white': 'black', 'red' : 'green', 'yellow': 'blue', 'black': 'white', 'green': 'red', 'blue': 'yellow'}

Тогда вы можете получить ответ, просто проверив каждое существование цвета в dict и вернув значение.

Если вы не хотите расширять dict вручную, выможет программно сделать это:

inverse_dict = { v:k for (k,v) in cols.items() }

Кроме того, вам не нужно вызывать cols.keys (), чтобы проверить, существует ли ключ в dict. Просто проверьте с помощью

if col in cols

Это более эффективно, потому что это проверка хеш-таблицы (~ O (1)), а не проверка списка (O (n)).

Добавление этогоВ общем, у вас может быть такое решение:

def revert_color(colors):
    colors = {'white': 'black', 'red' : 'green', 'yellow': 'blue'}
    inverse_colors = { v:k for (k,v) in cols.items() }

    complete_inverse = {**colors, **inverse_colors}

    # If color exists in the dict, return the inverse, else return the color itself.
    return [ complete_inverse[color] if color in complete_inverse else color for color in colors ]
0 голосов
/ 04 ноября 2019

Сделайте копию своего словаря и добавьте возвращенные записи. Тогда просто используйте понимание списка:

def RevertCol(L):
    cols = {'white': 'black', 'red' : 'green', 'yellow': 'blue'}
    cols_new = cols.copy()
    cols_new.update(dict([(value, key) for key, value in cols.items()]))
    return [cols_new.get(col) for col in L]
0 голосов
/ 04 ноября 2019

Инвертировать первый словарь, объединить их, а затем просто взять то, что вам нужно?

def RevertCol2(L):
    cols = {'white': 'black', 'red': 'green', 'yellow': 'blue'}
    cols.update({value: key for key, value in cols.items()})
    return [cols[i] for i in L if i in cols.keys()]

Он читается яснее (для меня) и устраняет их для циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...