使用键起始字符访问Python dict值

时间:2013-06-14 10:52:25

标签: python dictionary

我想知道:是否可以使用不完整的密钥访问dict值(只要给定字符串的条目不超过一个)?例如:

my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
print my_dict['Date']
>> '15th july'

这可能吗?怎么可能呢?

7 个答案:

答案 0 :(得分:38)

您无法直接使用dict[keyword]执行此操作,您必须遍历dict并将每个键与关键字匹配,并在找到关键字时返回相应的值。 这将是O(N)操作。

>>> my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
>>> next(v for k,v in my_dict.items() if 'Date' in k)
'15th july'

要获取所有此类值,请使用列表解析:

>>> [ v for k,v in my_dict.items() if 'Date' in k]
['15th july']

如果您只想要那些键以“Date”开头的值,请使用str.startswith

>>> next( v for k,v in my_dict.items() if k.startswith('Date'))
'15th july'
>>> [ v for k,v in my_dict.items() if k.startswith('Date')]
['15th july']

答案 1 :(得分:5)

不是最佳解决方案,可以改进(覆盖 getitem

class mydict(dict):
    def __getitem__(self, value):
        keys = [k for k in self.keys() if value in k]
        key = keys[0] if keys else None
        return self.get(key)


my_dict = mydict({'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'})
print(my_dict['Date'])# returns 15th july

答案 2 :(得分:3)

当然有可能:

print next(val for key, val in my_dict.iteritems() if key.startswith('Date'))

但这会在字典中进行全面扫描。它只找到第一个这样的匹配键(其中'first'是任意的),如果没有键匹配,则引发StopIteration而不是KeyError

为了更接近你的想法,最好把它写成一个函数:

def value_by_key_prefix(d, partial):
    matches = [val for key, val in d.iteritems() if key.startswith(partial)]
    if not matches:
        raise KeyError(partial)
    if len(matches) > 1:
        raise ValueError('{} matches more than one key'.format(partial))
    return matches[0]

答案 3 :(得分:1)

>>> my_dict = {'name': 'Klauss', 'age': 26, 'Date of birth': '15th july'}
>>> next(v for k,v in my_dict.items() if 'Date' in k)
'15th july'


>>> [ v for k,v in my_dict.items() if 'Date' in k]
['15th july']


>>> next( v for k,v in my_dict.items() if k.startswith('Date'))
'15th july'
>>> [ v for k,v in my_dict.items() if k.startswith('Date')]
['15th july']

如果我使用上面给出的方法我得到StopIteration异常

答案 4 :(得分:0)

您并不是在建议一致的API:

  1. my_dict['']的结果应该是什么?您没有一对一的映射。
  2. 如何将其扩展到str以外的其他类型?
  3. 你不能直接拥有它的另一个原因,即使是字符串并假设你总是返回一个列表,是因为Python的dict是使用哈希表实现的,它将映射xy和{ {1}}表格中不相关的单元格。

    所以,走另一条道路:这样的查找意味着需要更慢的xz实现,(这是没有意义的,针对不常见的使用进行优化)或者像完整扫描一样慢 - 您也可以手工编写,因为 通常值得一个专用的便利方法。

答案 5 :(得分:0)

在pywinauto中有一个很好的,聪明的'模糊'字典实现 - 这可能是你在这里所需要的完美。

https://code.google.com/p/pywinauto/source/browse/pywinauto/fuzzydict.py

和docs: http://pywinauto.googlecode.com/hg/pywinauto/docs/code/pywinauto.fuzzydict.html

(编辑:虽然如果你特别想从键的开头匹配,你可能需要用你的自定义代码替换SequenceMatcher逻辑)

答案 6 :(得分:0)

您可以使用内置的过滤器功能根据特定条件过滤字典,列表等。

filtered_dict = dict(filter(lambda item: "Date" in item[0], my_dict.items()))

优点是您可以将其用于不同的数据结构。