2012-02-09 2 views
1

Я пытаюсь получить все значения (за исключением того, что соответствует определенному ключу) из списка dicts, делая это:Порядок значений при извлечении Python ДИКТ к списку

fv = [[v for (k,v) in d.iteritems() if k is not 'xKey'] for d in someDict] 

где someDict, как:

[{xKey:0.1,yKey:0.2,zKey:0.3},{yKey:0.9,xKey:0.7,zKey:0.4}...] 

Я знаю, что у dict нет неотъемлемого порядка. Но мой список списков fv должен иметь значения в порядке. Я подумываю о том, чтобы сортировать диктофон по ключу, а затем делать то, что я только что сделал. Но это гарантированно работает?

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

Обновление: Когда я говорю, что мне нужны значения в порядке, их действительно не нужно сортировать. Что я имею в виду - мне нужно иметь возможность каждый раз получать список значений в фиксированном детерминированном порядке. выше, я всегда хочу получить [[0.2.0.3], [0.9.0.4]], хотя это может быть не отсортированный порядок как таковой. Сортировка обеспечит соблюдение одного детерминированного порядка. Что мне действительно нужно, так это сохранение позиции значений в конечном списке. Значение yKey всегда должно быть первым значением в каждом списке, значение zKey всегда должно быть вторым значением в каждом списке и так далее, даже если ykey, zkey и т. Д. Могут быть в любом порядке в словаре.

+2

Я бы использовал «OrderedDict», а затем измерил скорость и посмотрел, является ли производительность проблемой. Часто очень сложно прогнозировать производительность без значительного опыта в области, представляющей интерес. –

+0

Я согласен с тем, что словарь со временем будет расти со временем, и я понимаю, что мы, возможно, не должны исправлять это, если-это-не-сломано, но я не хочу пересматривать это через неделю. – atlantis

+0

«фиксированный детерминированный порядок ... он не может быть отсортированным порядком как таковым». У вас не может быть неопределенного, но детерминированного порядка. Это просто задание проблем со следующей версией, имеющей разные неуказанные детерминированным порядком. Пожалуйста, сделайте конечное, определенное и эффективное заявление. Функция надежды не будет хорошо работать. –

ответ

2

Если вы знаете, список возможных ключей, которые ваши dicts могут содержать следующее решение может работать для вас:

allkeys = ... # might be known; or obtained from available dicts by union; 
       # 'xKey' can be removed at this stage to simplify the list 
       # comprehension that follows 
sortedKeys = sorted(allKeys) 
list_of_values = [[d.get(k) for k in sortedKeys if k in d] 
                for d in list_of_dicts] 

Это может быть медленнее, чем iteritems хотя. Часть if k in d может быть удалена, если все dicts содержат один и тот же набор ключей.

1

Обычная дрель это.

  1. Создайте свой словарь как dict. Скорость отличная.

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

    • Преобразовать всю вещь к OrderedDict

    • Сортировка ключей. for k in sorted(some_dict.keys()):

    Выбор является одним из амортизационных отчислений. Если вы делаете одно, соберите. если вы делаете несколько вещей, создайте OrderedDict.

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

    ordered_values = list(sorted(some_dictionary.values())) 
    
+0

Это только я, или он просит отсортированные _values_? – voithos

+1

"order.What я действительно забочусь о поддержании позиции значений в конечном списке.". Так. неясно, следует ли сортировать ключи **, чтобы гарантировать детерминированный порядок, или значения ** должны быть отсортированы, чтобы гарантировать детерминированный порядок. Я голосую за ключи, так как это проще. Вопрос, конечно, неясен. –

+0

Ваша часть 3, похоже, не работает для меня? Это тот случай, который мне нужен. –

Смежные вопросы