Как вы используете цикл, чтобы назначить значение словаря на основе ключа - PullRequest
0 голосов
/ 06 июня 2018

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

Например:

list = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']

my_dict = {}

for i in range(len(list)):
     if any("cat" in s for s in list):
          my_dict[list[i]] = 'categorical'
     if any("num" in s for s in list):
          my_dict[list[i]] = 'numerical'  

Я пытаюсь получитьсловарь, который зациклится и приведет к:

my_dict = {'cat1': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}

Спасибо за любую помощь!

Ответы [ 9 ]

0 голосов
/ 06 июня 2018
list_ = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']
# Don't name the variable "list" as it is a keyword if you can't think of anything else append a underscore at end

my_dict = {}

for item in list_:
    if "cat" in item:
        my_dict[item] = 'categorical'
    elif "number" in item:
        my_dict[item] = 'numerical'

print(my_dict)
0 голосов
/ 06 июня 2018
import itertools
lst = [‘cat1’, ‘cat2’, ‘cat3’, ‘number1’, ‘number2’, ‘number3’]
values = [‘categorical’, ‘numerical’]

dict(filter(lambda item: item[0][:3] == item[1][:3], list(itertools.product(lst, values))))
0 голосов
/ 06 июня 2018

Самый простой ответ:

l = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3', 'junk']
d = {k: 'categorical' if 'cat' in k else 'numerical' if 'number' in k else 'unknown' for k in l}

Вывод:

{'cat1': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical', 'junk': 'unknown'}
0 голосов
/ 06 июня 2018

Попробуйте использовать словарь setdefault Функция:

l = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']
my_dict = {}
for i in l:
    my_dict.setdefault(i,['numerical' if 'number' in i else 'category'][-1])  
print(my_dict)

Вывод:

{'cat1': 'category', 'cat2': 'category', 'cat3': 'category', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}
0 голосов
/ 06 июня 2018

Во-первых, постарайтесь не перезаписывать встроенные модули, такие как str, list и т. Д., Своей переменной / функциями.

Простой способ сделать это:

some_elements = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']

my_dict = {}

for elt in some_elements:
    if "cat" in elt:
        my_dict[elt] = 'categorical'
    elif "num" in elt:
        my_dict[elt] = 'numerical'  

print(my_dict)

# {'cat1': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical', 
# 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}
0 голосов
/ 06 июня 2018

У Стивена Рауха хорошая идея.Вот несколько более краткая версия того, что он написал, используя dict.get.

matches = {'num': 'numerical', 'cat': 'categorical'}
result = {k : matches.get(k[:3], 'unknown') for k in items}

print(result)
{'cat1': 'categorical',
 'cat2': 'categorical',
 'cat3': 'categorical',
 'number1': 'numerical',
 'number2': 'numerical',
 'number3': 'numerical'}

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

result = {k : matches[k[:3]] for k in items if k[:3] in matches}

Вот мое мнение.Сначала отсортируйте items, а затем найдите индекс разрыва.

items.sort()

for i, l in enumerate(items):
    if l.startswith('num'):
        break

result = dict.fromkeys(items[:i], 'categorical')
result.update(dict.fromkeys(items[i:], 'numerical'))

Лучше всего подходит только для двух классов значений.

print(result)
{'cat1': 'categorical',
 'cat2': 'categorical',
 'cat3': 'categorical',
 'number1': 'numerical',
 'number2': 'numerical',
 'number3': 'numerical'}
0 голосов
/ 06 июня 2018

Измените свой код немного;используйте startswith для поиска совпадения:

lst = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']

my_dict = {}

for x in lst:
    if x.startswith('cat'):
        my_dict[x] = 'categorical'
    elif x.startswith('num'):
        my_dict[x] = 'numerical'

print(my_dict)

# {'cat1': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}
0 голосов
/ 06 июня 2018

Ваш пример довольно близок, но имеет несколько проблем.Вот решение, которое изменяет ваш код как можно меньше:

lst = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']

my_dict = {}

for value in lst:
     if "cat" in value:
          my_dict[value] = 'categorical'
     if "num" in value:
          my_dict[value] = 'numerical'  

Первая серьезная проблема заключается в том, что вы никогда не должны переопределять встроенный.Используйте lst или list_ not list.

Теперь давайте посмотрим на этот бит вашего кода:

if any("cat" in s for s in lst):

... когда он у вас есть, он проверяет, появляется ли "cat"в любом месте списка (не только в элементе, который вы хотели проверить).

Поскольку это правда, 'cat1' будет назначен категориальному.Но поскольку у вас есть другой оператор if, который также принимает значение true для числовых значений, этот результат перезаписывается, и в итоге все записи перечисляются как числовые.

0 голосов
/ 06 июня 2018

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

items = ['cat1', 'cat2', 'cat3', 'number1', 'number2', 'number3']
matches = {'num': 'numerical', 'cat': 'categorical'}
result = {i: [v for k, v in matches.items() if k in i][0] for i in items}
print(result)

Как?

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

Результаты:

{'cat1': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical',
 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...