создать словарь / список с двумя парами ключей: значение / элемент, которые имеют итеративные формы - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу получить словарь и список типа

{f1(0):g1(0), f2(0):g2(0),f1(1):g1(1), f2(1):g2(1)}
[f1(0),f2(0),f1(1),f2(1)]

, где f1(x), f2(x) и g1(x), g2(x) - некоторые определенные функции.

Существует две группы генерации f1(x):g1(x),f2(x):g2(x) и for i in range(2).

Мы можем определить этот словарь с помощью следующего кода

new_dict = {f1(x):g1(x) for x in range(2)}
new_dict.update({f2(x):g2(x) for x in range(2)})

Однако у списка есть порядок, и мне кажется, что я должен создать такой список с помощью цикла for.

new_list= list()
for i in range(2)
    new_list.append(f1(i))
    new_list.append(f2(i))

Интересно, есть ли какой-нибудь элегантный способ, подобный следующему:

{f1(x):g1(x), f2(x):g2(x) for x in range(2)}
[f1(x) , f2(x)  for x in range(2)]

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Интересно, есть ли какой-нибудь элегантный способ, подобный следующему:

{f1(x):g1(x), f2(x):g2(x) for x in range(2)}
[f1(x) , f2(x)  for x in range(2)]

Вы можете иметь различное количество выходов в каждом цикле, используя цепочку.

from itertools import chain

[*chain.from_iterable([f1(x), f2(x)] for x in range(2))]
dict(*chain.from_iterable([(f1(x), g1(x)), (f2(x), g2(x))] for x in range(2)))

Вы также можете сделать цепочку самостоятельно, но это займет больше петель.

[f for fs in ((f1(x), f2(x)) for x in range(2)) for f in fs]
0 голосов
/ 02 февраля 2019

Используйте список функций в понимании.

{f(x): g(x) for x in range(2) for f, g in [(f1, g1), (f2, g2)]}

Этот список также может быть условным, в зависимости от того, насколько вы заботитесь о порядке (например, если ключ может быть перезаписан).что теперь в диктантах Python 3.7 запоминается порядок вставки (и всегда есть OrderedDict)

new_dict = {f(x): g(x) for x in range(2) for f, g in {f1:g1, f2:g2}.items()}

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

new_list = [*new_dict]

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

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

pairs = [(f(x), g(x)) for x in range(2) for f, g in [(f1, g1), (f2, g2)]]
new_dict = dict(pairs)
new_list = [f for f, _ in pairs]

Если вы все еще используете старую версиюPython, обратите внимание, что вы также можете сделать OrderedDict из таких пар, как это,

from collections import OrderedDict

new_dict = OrderedDict((f(x), g(x)) for x in range(2) for f, g in [(f1, g1), (f2, g2)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...