在python中选择带有条件的多个键

时间:2018-11-19 03:42:55

标签: python dictionary

我有一本包含成千上万个键的字典,这是一个例子。

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

3 个答案:

答案 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