Словарные ключи как единый список - PullRequest
1 голос
/ 08 апреля 2020

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

mydict={('google','yahoo'):['gmail','browsing'],'wix':['website'],('chrome','firefox'):['Browsers']}
KeysAsList=[]
for k in list(mydict.keys()):
    if type(k)==tuple:
        for item in k:
            KeysAsList.append(item)
    else:
        KeysAsList.append(k)`
print(KeysAsList)

output=['google', 'yahoo', 'wix', 'chrome', 'firefox']

Я хочу добиться того же результата, используя понимание списка. Заранее спасибо. : -)

Ответы [ 4 ]

3 голосов
/ 08 апреля 2020

Вы можете преобразовать ключ в список из одного элемента, если он не является кортежем:

output = [i for k in mydict for i in (k if isinstance(k, tuple) else [k])]
2 голосов
/ 08 апреля 2020

Вы можете использовать этот список понимания:

KeysAsList=[k for keys in mydict for k in (keys if isinstance(keys, tuple) else [keys])]
1 голос
/ 08 апреля 2020

Если бы в качестве ключей использовались только кортежи строк, вы могли бы использовать:

output = [key for tup in mydict for key in tup]

Но из-за 'wix' в качестве ключа вы должны проверить, является ли ключ кортежем:

output = [key for tup in mydict for key in (tup if isinstance(tup, tuple) else [tup])]
0 голосов
/ 08 апреля 2020

Не совсем понимание списка, но вы также можете использовать itertools.chain.from_iterable здесь, чтобы выполнить выравнивание после нормализации ключей ко всем кортежам. Для создания одноэлементного кортежа мы можем использовать (x,).

>>> from itertools import chain
>>> mydict={('google','yahoo'):['gmail','browsing'],'wix':['website'],('chrome','firefox'):['Browsers']}
>>> list(chain.from_iterable(x if isinstance(x, tuple) else (x,) for x in mydict))
['google', 'yahoo', 'wix', 'chrome', 'firefox']
...