我有一本字典
{'A': 0, 'B': 1, 'C': 2, 'D': 3, etc}
在字典没有排序的情况下,如何在不造成值缺口的情况下从此字典中删除元素?
一个例子:
我有一个很大的矩阵,其中行表示单词,列表示遇到这些单词的文档。我将单词及其相应的索引存储在字典中。例如,对于这个矩阵
2 0 0
1 0 3
0 5 1
4 1 2
这本字典看起来应该是:
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}
如果删除单词'apple'
和'banana'
,矩阵将只包含两行。因此,字典中'orange'
的值现在应该等于0
而不是1
,'pear'
的值应该是1
而不是3
。
在Python中,字典是有序的,所以我可以编写类似的东西来重新分配值:
i = 0
for k, v in words.items():
v = i
i += 1
或者,或者,或者
words = dict(zip(terms.keys(), range(0, matrix.shape[0])))
我认为,这远不是改变价值观的最有效的方式,而且它也不会适用于无序字典。如何有效地做到这一点?在字典没有排序的情况下,是否有任何方法可以轻松地重新分配值?
发布于 2018-06-03 04:03:32
将dict转换为排序列表,然后在不需要删除单词的情况下构建一个新的dict:
import itertools
to_remove = {'apple', 'banana'}
# Step 1: sort the words
ordered_words = [None] * len(words)
for word, index in words.items():
ordered_words[index] = word
# ordered_words: ['apple', 'orange', 'banana', 'pear']
# Step 2: Remove unwanted words and create a new dict
counter = itertools.count()
words = {word: next(counter) for word in ordered_words if word not in to_remove}
# result: {'orange': 0, 'pear': 1}
这是一个O(n)的运行时,因为使用索引操作手动排序列表是一个线性操作,而不是sorted
,后者是O( n )。
还请参阅itertools.count
和next
的文档。
发布于 2018-06-03 03:45:21
您可以使用现有逻辑,使用排序的字典表示:
import operator
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}
sorted_words = sorted(words.items(), key=operator.itemgetter(1))
for i, (k, v) in enumerate(sorted_words):
words[k] = i
发布于 2018-06-03 03:52:51
最初我们有:
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}
要从最小到最大重新排序,您可以使用sorted
和字典理解:
std = sorted(words, key=lambda x: words[x])
newwords = {word:std.index(word) for word in std}
https://stackoverflow.com/questions/50665866
复制