оптимизация кода в питоне - PullRequest
0 голосов
/ 03 апреля 2012

Я работаю со словарями на python.

s = {'k1':['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg']}

Я создал код как:

d = {}
for values in enumerate(s.values()[0]):
    if values[0]<2:
        d[values[1]] = 'True'
    else:
        d[values[1]] = 'False'

Могу ли я преобразовать его в один код с использованием списка или лямбда-выражений?

Мне нужен ответ как:

{'aa': 'True', 'bb': 'True', 'cc': 'False', 'dd': 'False', 'ee': 'False', 'ff': 'False', 'gg': 'False'}

обновлено - ошибка ввода кода sry

Ответы [ 3 ]

7 голосов
/ 03 апреля 2012

В ответ на:

d = {}
for values in enumerate(s.values()[0]):
    if values[0]<2:
        d['ans'] = 'True'
    else:
        d['ans'] = 'False'

один вкладыш:

d = {'ans': str(len(s.values()[0]) < 2)}

То, что вы делаете, бессмысленно. По сути, код, который вы разместили, всегда будет устанавливать d['ans'] на 'True', если длина s.values()[0] меньше 2 (иначе 'False'). Это потому, что первый элемент в 2-кортеже, получаемый с помощью enumerate, является индексом (который вы сравниваете с <2). Для всех случаев, когда длина списка больше 2, предложение else будет сохранять значение 'False'. Вам даже не нужен цикл для этого.

Обновление: Для вашей новой версии:

d = dict( [(val, str(index < 2)) for (index, val) in enumerate(s.values()[0])] )

или

d = dict( [(i , "True") for i in li[:2]] + [(i, "False") for i in li[2:]] )

обновление 2: или, если вы хотите обновить существующий словарь:

d.update( (( (val, str(index < 2)) for (index, val) in enumerate(s.values()[0]) )) )
1 голос
/ 03 апреля 2012

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

d = {}
for index, value in enumerate(s.itervalues()[0]):
    if index < 2:
        d[value] = 'True'
    else:
        d[value] = 'False'

Затем вырежьте внутреннюю часть цикла:

d = {}
for index, value in enumerate(s.itervalues()[0]):
    d[value] = str(index < 2)

Это можно сделать какПонимание словаря:

d = {value: str(index < 2) for index, value in enumerate(s.itervalues()[0])}

Или, если выразиться иначе, и, возможно, лучше,

thelist = s.itervalues()[0]
d = {value: 'True' for value in thelist[:2]}
d.update((value, 'False') for value in thelist[2:])

Цель этого кода, к сожалению, непостижима.

Ценность этого весьма сомнительна, поскольку порядок диктовок не является абсолютным.В конечном итоге он фактически основан на случайном элементе словаря, во всех реализациях Python и порядках построения словаря.

1 голос
/ 03 апреля 2012

Вау, это действительно странный код.

Давайте попробуем немного переписать его:

d={}
for values in s['k1']:
    d['ans'] = str(values[0] < 2)

Что я не понимаю, так это: вы понимаете, что значение d['ans'] будет значением последнего сравнения?

И, честно говоря, я действительно не знаю точно, что это значит.Не могли бы вы уточнить немного больше?

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