我的大多数小型项目使用字典都可以正常工作,所以现在更改它基本上意味着重新开始。
假设我有两个不同的词典(字典 1 和字典 2)。
一个是:
{'the dog': 3, 'dog jumped': 4, 'jumped up': 1, 'up onto': 8, 'onto me': 13}
第二个是:
{'up': 12, 'dog': 22, 'jumped': 33}
我想找到第一本字典的第一个单词等于第二本字典的单词。这 2 个词典的长度不同,如示例中所示。然后在我找到它们之后,划分它们的值。
所以我想做的,有点使用一点Java是:
for(int i = 0;i<dict1.length(),i++){
for(int j = 0;j<dict2.length(),j++){
if(dict1[i].contains(dict2[j]+" ") // not sure if this works, but this
// would theoretically remove the
// possibility of the word being the
// second part of the 2 word element
dict1[i] / dict2[j]
到目前为止,我尝试的是尝试制作 4 个不同的列表。dict1
键的列表、dict1
值的列表以及dict2
的相同列表。然后我意识到我什至不知道如何检查dict2
是否有任何与dict1
相似的元素。
我尝试在字典中创建一个额外的值(一种索引),所以它会让我到达某个地方,但事实证明dict2.keys()
也不是可迭代的。这反过来又会让我相信使用 4 个不同的列表并试图以某种方式使用它进行比较是非常错误的。
字典根本没有任何处理部分键的功能。键是不透明的对象。他们要么在那里,要么不在那里。
所以是的,您将遍历第一个字典中的所有键,提取第一个单词,然后测试另一个词典是否将第一个单词作为键:
for key, dict1_value in dict1.items():
first_word = key.split()[0] # split on whitespace, take the first result
if first_word in dict2:
dict2_value = dict2[first_word]
print(dict1_value / dict2_value)
所以这会取dict1
中的每个键,拆分第一个单词,并测试该单词是否是dict2
中的键。如果是,请获取值并打印结果。
如果您需要更频繁地测试这些第一个单词,您可以通过首先构建另一个结构来创建从第一个单词到整个键的索引,从而使它更有效率。只需将第一个字典的每个键的第一个单词存储在新字典中:
first_to_keys = {}
for key in dict1:
first_word = key.split()[0]
# add key to a set for first_word (and create the set if there is none yet)
first_to_keys.setdefault(first_word, set()).add(key)
现在first_to_key
是一个第一个单词的字典,指向键集(因此,如果同一个第一个单词出现多次,您将获得所有完整的键,而不仅仅是其中一个)。构建此索引一次(并在每次添加或删除键时更新值dict1
,因此请随时保持最新)。
现在,您可以将该映射与其他字典进行比较:
for matching in first_to_key.keys() & dict2.keys():
dict2_value = dict2[matching]
for dict1_key in first_to_key[matching]:
dict1_value = dict1[dict1_key]
print(dict1_value / dict2_value)
这将使用两个字典中的键作为集合;dict.keys()
对象是一个字典视图,允许您应用集合操作。&
为您提供了两个字典键集的交集,因此两者中存在的所有键。
只有当您需要更频繁地获取第一个单词时,才需要使用第二个选项。它为您提供了另一个方向的快速路径,因此您可以循环dict2
,并再次快速返回到第一本字典。
这是一个使用str.startswith
字符串方法的解决方案
for phrase, val1 in dict1.items():
for word, val2 in dict2.items():
if phrase.startswith(word):
print(val1/val2)