Как отсортировать значения словаря по критериям, налагаемым значениями списка в новом словаре? - PullRequest
0 голосов
/ 03 августа 2020

Приношу извинения за название, не могу придумать, как это сформулировать, если у кого-то есть предложения, я с радостью отредактирую!

В принципе, у меня есть словарь и список. Словарь:

dict1 = {('red fruit', 'green fruit'): 'apple', ('orange fruit', 'pink fruit'): 'peach', ('five fruit', 'one fruit'): 51, ('ten fruit', 'nine fruit'): 19, ('period', 'exclamation mark'): '.!'}

Список:

list1 = [('alphabet'), ('number'), ('neither')]

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

Значения для ('алфавит') должны быть ключами dict1, когда их значения являются алфавитными, значения для ('number') должны быть ключами dict1, когда их значения являются числовыми, а значения ('none') должны быть, когда значения ключей не работают в обоих случаях.

Например, my вывод должен быть:

{('alphabet'): [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')], ('number'): [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], ('neither'): [('period', 'exclamation mark')]}

Я начал с создания нового словаря с ключами из списка и значениями в виде пустых списков, и я хочу добавить значения, когда они соответствуют требованиям, изложенным выше (возможно, используя .isdi git () и .isalpha ()) в пустые списки. Но я действительно не понимаю, как добавить значения к указанным c ключам, когда они соответствуют требованиям?

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

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

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

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

def string_type(s):
    if s.isalpha():
        return 'alphabet'
    elif s.isdigit():
        return 'number'
    else:
        return 'neither'

Затем вы можете отфильтровать нужные вам ключи и поместить их в словарь в порядке, указанном в list1

def process(dict1, list1):
    output = {k: [] for k in list1}
    for key, val in dict1.items():
        t = string_type( str(val) )
        if t in list1:
            output[t].append(key)
    return output

Примеры выходных данных :

>>> dict1 = {('red fruit', 'green fruit'): 'apple', ('orange fruit', 'pink fruit'): 'peach', ('five fruit', 'one fruit'): 51, ('ten fruit', 'nine fruit'): 19, ('period', 'exclamation mark'): '.!'}

>>> list1 = [('alphabet'), ('number'), ('neither')]
>>> process(dict1, list1)
{'alphabet': [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')], 'number': [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], 'neither': [('period', 'exclamation mark')]}

>>> list2 = [('number'), ('neither'), ('alphabet')]
>>> process(dict1, list2)
{'number': [('five fruit', 'one fruit'), ('ten fruit', 'nine fruit')], 'neither': [('period', 'exclamation mark')], 'alphabet': [('red fruit', 'green fruit'), ('orange fruit', 'pink fruit')]}
0 голосов
/ 03 августа 2020

Вы можете l oop над ключом, парами значений в словаре, добавляя ключи к соответствующему списку и использовать их для формирования нового словаря.

dict1 = {('red fruit', 'green fruit'): 'apple',
         ('orange fruit', 'pink fruit'): 'peach',
         ('five fruit', 'one fruit'): 51,
         ('ten fruit', 'nine fruit'): 19,
         ('period', 'exclamation mark'): '.!'}

list1 = [('alphabet'), ('number'), ('neither')]

alphabetical = []
numerical = []
other = []

for key, value in dict1.items():

    if isinstance(value, int):
        numerical.append(key)

    elif value.isalpha():
        alphabetical.append(key)

    else:
        other.append(key)

list2 = {'alphabet': alphabetical,
         'number': numerical,
         'neither': other}

print(list2)

Обратите внимание, что где вы используете, например, ('foo') это то же самое, что 'foo' (хотя выше я сохранил синтаксис, который вы использовали при назначении list1).

Здесь я использовал isinstance(..., int), потому что ваши элементы данных являются целыми числами. isdigit будет иметь значение, только если они будут строками, содержащими цифры.

Также обратите внимание, что isalpha будет оценивать True, только если все символы в строке являются алфавитными. Этот метод в первую очередь предназначен для использования с отдельными символами, но вопрос не указывает, что должно произойти, если строка содержит смесь типов символов, поэтому я оставил его здесь. Но если, например, у вас есть пробел в середине одного из значений словаря, то isalpha вернет False, даже если остальные символы будут алфавитными.

...