如何使用循环基于键分配字典值

时间:2018-06-06 02:58:25

标签: python dictionary for-loop

我试图遍历用于创建字典键的列表,并根据几个不同的类别分配值

例如:

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 :(得分:2)

如果您可以假设列表中的值与您的某个查找匹配,则可以这样做:

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中的每个值并返回匹配的值。该值用作dict理解中的值。

结果:

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

答案 1 :(得分:2)

Stephen Rauch有个好主意。这是使用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'}

答案 2 :(得分:0)

你的例子相当接近,但有一些问题。这是一个尽可能少地修改代码的解决方案:

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,这个结果会被覆盖,你最终将所有条目都列为数字。

答案 3 :(得分:0)

稍微改变你的代码;使用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'}

答案 4 :(得分:0)

首先, 尽量不要用你的变量/函数覆盖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'}

答案 5 :(得分:0)

最简单的答案:

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'}

答案 6 :(得分:0)

尝试使用字典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'}

答案 7 :(得分:0)

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)

答案 8 :(得分:0)

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))))