Самый быстрый и простой способ получить список из списка в ключах словаря - PullRequest
0 голосов
/ 16 июня 2020

У меня есть словарь шаблонов вроде этого {('c1', '#ffe'): (function1, args), ('c2', 'red'): (function2, args), ('c3', ('rbg', 'hex')): (function3, args)}. (просто пример не фактического словаря, а того же шаблона)

Я хочу получить список из первых элементов кортежей, которые являются ключами словаря.


Я пробовал это, и он отлично работает, но я хочу знать, есть ли более простой или лучший способ.

d = {   
    ('c1', '#ffe'): ('function1', 'args'), 
    ('c2', 'red'): ('function2', 'args'), 
    ('c3', ('rbg', 'hex')): ('function3', 'args')
    }

l = list(dict(list(d)).keys())
print(l)

Кроме того, помогите мне сделать словарь более организованным с вашими идеями,

Спасибо.

1 Ответ

1 голос
/ 16 июня 2020

Я считаю, что вы можете пропустить часть о построении словаря из ключей:

l = [k[0] for k in d]

В вашем примере создание словаря из ключей в основном делает то же самое, но с дополнительной работой по созданию промежуточный словарь, использующий «значения» -частей ключей (например, '#ffe').

Есть два функциональных различия, о которых я могу думать:

  1. Ваш конструкция словаря будет неявно проверять ключи d: Например, если d содержит ключ из трех частей

    ('c4', 4, 5): ('f4', 'args')

Тогда ваш dict конструкция вызовет исключение; в то время как более короткая итерация k[0]... будет просто использовать c4 без каких-либо ошибок.

Если d содержит дубликаты в первой части ключа, например, дополнительный c1

('c1', '#abc'): (...

Тогда ваш Конструкция dict вернет только один c1 в результирующем списке, тогда как итерация ключа даст c1 дважды в результирующем списке. В зависимости от желаемого, это можно использовать как проверку работоспособности; или вы можете использовать

l = {k[0] for k in d}

, чтобы получить набор вместо списка.

Что касается более организованного словаря, это зависит от того, что вы хотите с ним делать. Структурированные ключи, особенно разных форм, как в вашем примере, несут в себе опасность того, что ваши «геттеры» могут запутаться. В таких случаях я бы явно моделировал части того, что вы помещаете в словарь (как ключи, так и значения), как классы (например, используя https://docs.python.org/3/library/dataclasses.html).

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