我的大多数小型项目都使用字典工作得很好,所以现在改变它基本上意味着重新开始。
假设我有两个不同的词典(dict1和dict2)。
一个人:
{'the dog': 3, 'dog jumped': 4, 'jumped up': 1, 'up onto': 8, 'onto me': 13}
第二个是:
{'up': 12, 'dog': 22, 'jumped': 33}
我想找到第一个字典的第一个单词与第二个单词的第一个单词相同的位置。这两个词典的长度不同,如示例中所示。然后在找到它们之后,划分它们的值。
所以我想要做的是,使用一些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个不同的列表,并试图用某种方式比较它是非常错误的。
答案 0 :(得分:2)
字典根本没有任何设施来处理部分密钥。键是不透明的对象。他们在那里或不在那里。
所以是的,你会遍历第一个字典中的所有键,提取第一个单词,然后测试另一个字典是否有第一个单词作为键:
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)
这使用两个词典中的键作为 sets ; dict.keys()
对象是dictionary view,可让您应用集合操作。 &
为您提供了两个字典键集的交集,因此两者都存在所有键。
如果您需要更频繁地获取这些第一个单词,则只需使用第二个选项。它为您提供了另一个方向的快捷路径,因此您可以循环dict2
,然后再次快速返回第一个字典。
答案 1 :(得分:-2)
这是使用str.startswith
字符串方法
for phrase, val1 in dict1.items():
for word, val2 in dict2.items():
if phrase.startswith(word):
print(val1/val2)