Python 如何使用循环根据键分配字典值
我试图循环浏览一个列表,该列表用于创建字典键,并根据几个不同的类别分配一个值 例如:Python 如何使用循环根据键分配字典值,python,dictionary,for-loop,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"
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'}
谢谢你的帮助 如果您可以假设列表中的值与您的某个查找匹配,您可以这样做:
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中的每个值,并返回匹配的值。该值用作听写理解中的值
结果:
您的示例非常接近,但存在一些问题。下面是一个尽可能少地修改代码的解决方案:
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_uu非list。
现在让我们看一下您的代码:
if any("cat" in s for s in lst):
…正如您所看到的,这将检查“cat”是否出现在列表中的任何位置(而不仅仅是您要检查的项目)
因为这是真的,“cat1”将被分配到category。但是,因为您有另一个if语句,它也会对数值求值为true,此结果会被覆盖,最终所有条目都列为数值。稍微更改一下代码;使用
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'}
斯蒂芬·劳赫有个好主意。下面是他使用
dict.get
编写的内容的一个更简洁的版本
matches = {'num': 'numerical', 'cat': 'categorical'}
result = {k : matches.get(k[:3], 'unknown') for k in items}
如果要删除不匹配的值,请稍作修改:
result = {k : matches[k[:3]] for k in items if k[:3] in matches}
这是我的看法。首先对
项进行排序
,然后查找不连续性索引
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'}
最简单的答案是:
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'}
{'cat1': 'category', 'cat2': 'category', 'cat3': 'category', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}
尝试使用字典
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': 'categorical', 'cat2': 'categorical', 'cat3': 'categorical', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical', 'junk': 'unknown'}
{'cat1': 'category', 'cat2': 'category', 'cat3': 'category', 'number1': 'numerical', 'number2': 'numerical', 'number3': 'numerical'}
不要“名称列表”
list
,它会覆盖一个内置名称。为什么要使用enumerate
?我删除了它,原来的代码使用了索引,所以我想到了这一点。抢手货thanks@StephenRauch不,它不会,当然不会像选项1那样灵活!我喜欢这里的get()
。@stephernauch是的,我也喜欢你的答案。非常灵活。
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)
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))))