【问题标题】:Python - Dictionary of sets with the same keyPython - 具有相同键的集合字典
【发布时间】:2014-12-24 13:55:05
【问题描述】:

我正在尝试创建一个函数来读取每行有一个单词的文本文件,例如

afd
asmv
广告

它将获取用户给定长度的单词,并构造一个 python 字典,其中键是单词的字符串,其中字母被排序。这些值将是一组具有相同键的所有单词。到目前为止,我有:

def setdict():
wordfile = argv[1]
open(wordfile, "r")
setdict = {}
for line in wordfile:
    words = line.split()
    for word in words:
        word = word.rstrip("\n")
        if word == wordlength:
            key = str(sorted(word))

我有点迷失如何使用具有相同键的单词创建集合并将它们放入字典中。任何帮助将不胜感激。

【问题讨论】:

  • 为了将来参考,在计算方面,您正在寻找的一般概念是“multi-dict”(或“multi-map”或“multi-mapping”等)——比如一个字典(或地图等),但每个键有多个值。这是其中一种情况,知道正确的词可以很容易地搜索答案,但没有那个词几乎是不可能的。 (您会发现,在 Python 中,多字典通常表示为 dict,其值是实际值的 sets 或 lists,通常使用 collections.defaultdict 或 @ 构建dict 上的 987654326@ 方法,如 Robᵩ 的回答。)

标签: python dictionary set key


【解决方案1】:

collections.defaultdict 在这里很有用:

from collections import defaultdict
from pprint import pprint


words = defaultdict(set)

with open('input.txt') as input_file:
    for line in input_file:
        for word in line.split():
            sorted_list = sorted(word)
            sorted_str = ''.join(sorted_list)
            words[sorted_str].add(word)

pprint(words)

当然,你可以用defaultdict做任何事情,你也可以用dict.setdefault()做任何事情:

words = dict()
with open('input.txt') as input_file:
    for line in input_file:
        for word in line.split():
            sorted_list = sorted(word)
            sorted_str = ''.join(sorted_list)
            words.setdefault(sorted_str, set()).add(word)

【讨论】:

  • +1。使用defaultdict 绝对比测试in 或使用try/except 更好。当defaultdict 不合适时(例如,因为您需要一个实际的dict,这将引发KeyErrors),words.setdefault 仍然比其他答案更好。
【解决方案2】:

从简单的开始

words = ["hello","python","world"]
my_dict = {}
for word in words:
    try:
       my_dict[sorted(word)].append(word)
    except KeyError:
       my_dict[sorted(word)] = [word]

现在不再使用预定义的单词从文件中读取它们

  words = map(str.split,open("some_word_file.txt"))

【讨论】:

    【解决方案3】:

    这里的关键是使用 for 循环访问字典,使值集可用于操作。您可以通过逐行读取文件(readline)并检查以下内容来解决您的问题:

    for key, value in my_dict:
        if sorted(word) == key:
            value.append(word)
        else:
            my_dict[sorted(word)] = value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多