首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重新分配字典值

重新分配字典值
EN

Stack Overflow用户
提问于 2018-06-03 03:26:05
回答 5查看 2.2K关注 0票数 10

我有一本字典

代码语言:javascript
运行
AI代码解释
复制
{'A': 0, 'B': 1, 'C': 2, 'D': 3, etc}

在字典没有排序的情况下,如何在不造成值缺口的情况下从此字典中删除元素?

一个例子:

我有一个很大的矩阵,其中行表示单词,列表示遇到这些单词的文档。我将单词及其相应的索引存储在字典中。例如,对于这个矩阵

代码语言:javascript
运行
AI代码解释
复制
2 0 0
1 0 3
0 5 1
4 1 2

这本字典看起来应该是:

代码语言:javascript
运行
AI代码解释
复制
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}

如果删除单词'apple''banana',矩阵将只包含两行。因此,字典中'orange'的值现在应该等于0而不是1'pear'的值应该是1而不是3

在Python中,字典是有序的,所以我可以编写类似的东西来重新分配值:

代码语言:javascript
运行
AI代码解释
复制
i = 0
for k, v in words.items():
  v = i
  i += 1

或者,或者,或者

代码语言:javascript
运行
AI代码解释
复制
words = dict(zip(terms.keys(), range(0, matrix.shape[0])))

我认为,这远不是改变价值观的最有效的方式,而且它也不会适用于无序字典。如何有效地做到这一点?在字典没有排序的情况下,是否有任何方法可以轻松地重新分配值?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-03 04:03:32

将dict转换为排序列表,然后在不需要删除单词的情况下构建一个新的dict:

代码语言:javascript
运行
AI代码解释
复制
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.countnext的文档。

票数 8
EN

Stack Overflow用户

发布于 2018-06-03 03:45:21

您可以使用现有逻辑,使用排序的字典表示:

代码语言:javascript
运行
AI代码解释
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-06-03 03:52:51

最初我们有:

代码语言:javascript
运行
AI代码解释
复制
words = {'apple': 0, 'orange': 1, 'banana': 2, 'pear': 3}

要从最小到最大重新排序,您可以使用sorted和字典理解:

代码语言:javascript
运行
AI代码解释
复制
std = sorted(words, key=lambda x: words[x]) 
newwords = {word:std.index(word) for word in std}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50665866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档