我试图遍历用于创建字典键的列表,并根据几个不同的类别分配值
例如:
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'}
感谢您的帮助!
答案 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)
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))))