<p>您不能搜索字典的值:它是由它的键索引的,而值根本没有索引(事实上,它们甚至可能是不可散列的)。你知道吗</p>
<p>然后有两个选项:</p>
<ol>
<li><p>重新设计问题,使电话号码实际上是关键:</p>
<pre><code>{
u'123456789': {u'PhoneOwner': u'Bob', u'Frequency': 0},
u'98765431': {u'PhoneOwner': u'Sarah', u'Frequency': 0},
}
</code></pre>
<p>这非常实用,因为它可以让您立即索引词典:</p>
<pre><code>with open("Calllog.txt") as log:
for line in log:
phoneNumberDictionary[line]['Frequency'] += 1
</code></pre>
<p>但这意味着您将不得不重做数据,可能工作量很大,而且这可能不是处理数据的最方便的方法(例如,按所有者名称搜索)</p></li>
<li><p>将数据结构保留为列表,并直接在其中搜索匹配项:</p>
<pre><code>with open("Calllog.txt") as log:
for line in log:
entries = filter(lambda entry: entry['PhoneNumber'] == line, phoneNumberDirectory)
for entry in entries:
entry['Frequency'] += 1
</code></pre>
<p>这将很好地工作(让几个人有相同的电话号码。好的,坏的?这由您自己决定),但每次遍历整个目录时显然效率很低。如果您有一个已知的小数据集,这可能是最好的解决方案。</p></li>
<li><p>(在我看来,最好的选择)两者的某种结合。通常可以将数据存储在对象中,并将多个索引作为字典:</p>
<pre><code>class PhoneNumbers(object):
def __init__(self, entries):
self.frequencies = []
self.names = {}
self.numbers = {}
for i, entry in enumerate(entries):
self.frequencies.append(entry['Frequency'])
self.names[entry['PhoneOwner']] = entry['PhoneNumber']
self.numbers[entry['PhoneNumber']] = i
def register_call(self, number):
self.frequencies[self.numbers[number]] += 1
data = PhoneNumbers(phoneNumberDictionary)
with open("Calllog.txt") as log:
for line in log:
data.register_call(line)
</code></pre>
<p>或者这些行周围的一些变化与您打算对数据执行的操作相匹配。</p></li>
</ol>