2014-10-28 141 views
0

我试图创建将读取对每行一个字一个文本文件中的函数,像Python的 - 套使用相同的密钥

AFD
asmv
adsasd

词典

这将需要用户给定长度的文字,并将构建一个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)) 

我有点失去了如何创建与具有相同的密钥,并把它们在字典中的字集。任何帮助,将不胜感激。

+0

以供将来参考,在计算方面,你要找的总体思路是“多字典”(或“多映射“或”多映射“等) - 像一个字典(或地图等),但每个键有多个值。这是知道正确的词可以很容易地搜索答案的情况之一,但没有这个词几乎是不可能的。 (你会发现,在Python中,多字典通常表示为一个'dict',它的值可以是'set's或'list's的真实值,它通常用'collections.defaultdict'或'dict'上的'setdefault'方法,如Robᵩ的答案。) – abarnert 2014-10-29 00:58:23

回答

0

开始用一些简单的

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")) 
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) 
+0

+1。使用'defaultdict'肯定比测试'in'或使用'try' /'except'更好。当'defaultdict'不合适时(例如,因为你需要一个实际的'dict',会引发'KeyError's),'words.setdefault'仍然比其他答案好。 – abarnert 2014-10-29 00:55:06

0

此处的关键是使用for循环访问字典,该循环使值集可用于操作。你可以通过阅读该文件面向行(readline的),并检查以下解决您的问题:

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