我有一本包含成千上万个键的字典,这是一个例子。
Mydict = {'A01': 'value1', 'A02': 'value1', 'C01': 'value1', 'C02': 'value1',
'D02': 'value1', 'D03': 'value1', 'D04': 'value1', 'D05': 'value1',
'D06': 'value1', 'D07': 'value1', 'D08': 'value1', 'D09': 'value1'}
我想根据条件创建子词典。我想创建一个以特定字母开头的字典。假设我要使用“ C”和“ D”,但最高为“ D08”。这是我写的代码。它将选择所有C和D。
NewDict= {x: Mydict[x] for x in Mydict.keys() if x.__contains__('C' or 'D')}
答案 0 :(得分:0)
您似乎至少需要更新:
Mydict = {'A01': 'value1', 'A02': 'value1', 'C01': 'value1', 'C02': 'value1',
'D02': 'value1', 'D03': 'value1', 'D04': 'value1', 'D05': 'value1',
'D06': 'value1', 'D07': 'value1', 'D08': 'value1', 'D09': 'value1'}
NewDict= {x: Mydict[x] for x in Mydict.keys() if x.__contains__('D')
}
NewDict.update({x: Mydict[x] for x in Mydict.keys() if x.__contains__('C')
})
NewDict
也许有一种更有效的方法可以做到这一点,但是...
Python变量名称也应采用蛇形,例如new_dict
答案 1 :(得分:0)
您可以为要保留的字母创建set
,为“范围”创建另一个。然后,您通过适当地检查密钥来创建字典:
ranges = set(range(9))
letters = {'C', 'D'}
NewDict = {x: Mydict[x] for x in Mydict if x[0] in letters and int(x[1:]) in ranges}
由于检查set
中的成员身份为 O(1),因此即使您有成千上万的密钥,性能也不会出现问题。
如果您想非常详细地了解键和范围,可以创建一个字典,指定每个键想要的范围。例如:
ranges = {
'C': set(), # empty set denotes select all 'C'
'D': set(range(9))
}
NewDict = {x: Mydict[x] for x in Mydict if x[0] in ranges and (len(ranges[x[0]]) == 0 or int(x[1:]) in ranges[x[0]])}
print(NewDict)
输出
{'C01': 'value1', 'C02': 'value1', 'D02': 'value1', 'D03': 'value1', 'D04': 'value1', 'D05': 'value1', 'D06': 'value1', 'D07': 'value1', 'D08': 'value1'}
答案 2 :(得分:0)
表达式'C' or 'D'
等于'C',因此您所写的内容等同于仅查找'C'。您只需要将测试分成两个表达式即可。此外,使用in
比使用__contains__
{x: Mydict[x] for x in Mydict.keys() if 'C' in x or 'D' in x}
如果要对列表中的每个键进行测试(例如检查是否小于'D08'),请按照字典顺序进行操作。
NewDict= {x: Mydict[x] for x in Mydict.keys() if x < 'D08'}
对于区间比较,python提供了避免编写两个表达式的捷径,您可以直接编写:
NewDict= {x: Mydict[x] for x in Mydict.keys() if 'C01' < x < 'D08'}
根据需要使用包容性<=
或独占<
比较运算符。
对于更复杂的键条件,使用像以下这样的显式函数可能更清楚:
def condition(key):
return 'C01' < key < 'D08'
NewDict= {x: Mydict[x] for x in Mydict.keys() if condition(x)}
通过这种格式,您可以根据需要对键进行复杂的测试,并且结果仍易于阅读。
使用items()
遍历键和值(如:p
NewDict= {k: v for k,v in Mydict.items() if 'C01' < k < 'D08'}
最后,驼峰式变量通常为python中的类保留。对于变量,通常的约定是使用蛇形大小写,例如new_dict
。