сравнение списка с индексом словаря и возвращение значений словаря на основе оригинального порядка списка - PullRequest
0 голосов
/ 01 февраля 2019

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

list =['a','b','c','d'...n]

dict = {'d':'fourth' ,'a': 'first','b':'second','c':'third'...n}

Проблема, когда я выполняю следующее:

sorted_list = [value for index, value in dict.items() if index in list]

Я получаю список:

['fourth','first','second','third']

вместо:

['first','second','third','fourth']

Есть ли способ гарантировать, что сортировка поддерживает исходный порядок списка?

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

Ответы [ 4 ]

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

пара вариантов в зависимости от ваших потребностей:

from collections import OrderedDict


def ret(items, lookup):
    # using a Generator, which you can then get items as needed. if you need all items, just cast to list
    for li in items:
        yield lookup[li]


def ret2(lookup):
    # if all you are concerned with is alphanumeric sort by keys, use the inbuilt OrderedDict
    lookup = OrderedDict(sorted(lookup.items(), key=lambda t: t[0]))
    return lookup.values()

использование:

print (list(
    ret(
        items=['a','b','c','d'],
        lookup={'d':'fourth' ,'a': 'first','b':'second','c':'third'}
    )
))

print (ret2(lookup={'d':'fourth' ,'a': 'first','b':'second','c':'third'}))

https://docs.python.org/2/library/collections.html

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

Использование

list(map(dct.get,lst))
Out[60]: ['first', 'second', 'third', 'fourth']
0 голосов
/ 01 февраля 2019

Вот простой способ, используя operator.itemgetter:

l =['a','b','c','d']
d = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}

itemgetter(*l)(d)
('first', 'second', 'third', 'fourth')

Проблема с вашим кодом состоит в том, что вы перебираете dict.items(), и поэтому вы будетеизвлечение значений в порядке их появления в словаре.Вы хотите сделать это наоборот, таким образом, чтобы получить значения из словаря, перебирая значения в списке, чтобы получить их в том же порядке.

Используя itemgetter, вы выбираете из d все элементы в l, так что, как я уже говорил, это более лаконичный способ, который также может быть легко реализован с использованием списка.

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

Да, есть, просто переберите список и извлеките значения из словаря:

lst =['a','b','c','d']
dct = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}
result = [dct[i] for i in lst]

print(result)

Вывод

['first', 'second', 'third', 'fourth']

В качестве примечанияне используйте встроенные имена в качестве имен переменных.Приведенное выше понимание списка эквивалентно следующему циклу for:

result = []
for e in lst:
    result.append(dct[e])

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

lst =['a','b','c','d', 'f']
dct = {'d':'fourth' ,'a': 'first','b':'second','c':'third'}
result = [dct.get(e, 'missing') for e in lst]
print(result)

Вывод

['first', 'second', 'third', 'fourth', 'missing']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...