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