简体   繁体   English

从文件到字典的 Python 列表

[英]Python List to Dictionary from a file

I have a file of notes that im trying to convert to a dictionary.我有一个笔记文件,我试图将其转换为字典。 I got the script working but failed to output the data im looking for when there are repeated values.我让脚本正常工作,但在有重复值时无法输出我正在寻找的数据。

In short took the file commands or comments which are separated by # as per below.简而言之,按照下面的 # 分隔的文件命令或注释。 I take that list and seperate the 1st column "key" by # and the rest is the comment or definition.我使用该列表并用# 分隔第一列“键”,其余的是注释或定义。 Then i check the magic word im looking for, parse it match it and then to out.然后我检查我正在寻找的魔法词,解析它匹配它然后输出。

Flashcards file as per below认卡文件如下

> car # automobile 4 wheels and run 
> washington dc # the capital of United States 
> fedora # an operating distro
> cat file  # reads the file 
> car nissan # altima
> car nissan # altima ## first car 
> car nissan # maxima
> car nissan # rougue



flashcard_dict = dict()
flashcard_file = open('FlashCards','r')

enter = input("Searching nemo: ")


firstcolumn_str_list = list()

for x in flashcard_file:
    flashcard_sprint = x.strip()

    flascard_clean = flashcard_sprint.split("#",1)
    firstcolumn_str = flascard_clean[0]
    firstcolumn = firstcolumn_str.strip()
    firstcolumn_str_list.append(firstcolumn)
    secondcolumn = flascard_clean[1]

    flashcard_dict[firstcolumn] = secondcolumn


print
print ("###" * 3)



lista = list()
# this is version 4 - where lambda works but fails as it matches the string in all words.
# so if the word is "es"  all patterns are matched that has "es" AND NOT the specific word

filter_object = filter(lambda a: enter in a, firstcolumn_str_list)
for x in filter_object:
    lista.append(x)


print (lista)

cc = 0 
if cc < len(lista):
    for lambdatodictmatch in lista:

        if lambdatodictmatch in flashcard_dict:
            print (flashcard_dict[lambdatodictmatch])
        else:
            print ("NONEsense... nothing here")

else: 
    print ("NONEsense... nothing here")

Again it works but when i search for car nissan.它再次起作用,但是当我搜索汽车 nissan 时。 I get four responses but i only get the last "rougue" output or i get 4 repeated response "rougue".我得到四个响应,但我只得到最后一个“rogue”输出,或者我得到 4 个重复响应“rogue”。

what's the best way to accomplish this?实现这一目标的最佳方法是什么?

If you may have repeated elements then you should always use lists to keep even single value如果您可能有重复的元素,那么您应该始终使用列表来保留单个值

if firstcolumn not in flashcard_dict: 
    flashcard_dict[firstcolumn] = []

firstcolumn[firstcolumn].append(secondcolumn)

instead of代替

flashcard_dict[firstcolumn] = secondcolumn

EDIT:编辑:

Full working code with other changes具有其他更改的完整工作代码

  • first I used shorter and more readable names for variables,首先,我为变量使用更短且更易读的名称,
  • I read file at start and later use loop to ask for different cards.我在开始时读取文件,然后使用循环请求不同的卡。
  • I added command !keys to display all keys, and !exit to exit loop and finish program,我添加了命令!keys以显示所有键,并添加了!exit以退出循环并完成程序,
  • list(sorted(flashcards.keys())) gives all keys from dictionary without repeating values (and sorted) list(sorted(flashcards.keys()))给出字典中的所有键而不重复值(并排序)

I used io only to simulate file in memory - so everyone can simply copy and run this code (without creating file FlashCards ) but you should use open(...)我只使用io来模拟内存中的文件 - 所以每个人都可以简单地复制和运行这段代码(不创建文件FlashCards )但你应该使用open(...)

text = '''car # automobile 4 wheels and run 
washington dc # the capital of United States 
fedora # an operating distro
cat file  # reads the file 
car nissan # altima
car nissan # altima ## first car 
car nissan # maxima
car nissan # rougue
'''

import io

# --- constansts --- 

DEBUG = True

# --- functions ---

def read_data(filename='FlashCards'):

    if DEBUG:
        print('[DEBUG] reading file')
    
    flashcards = dict()  # with `s` at the end because it keeps many flashcards
    #file_handler = open(filename)
    file_handler = io.StringIO(text)
    
    for line in file_handler:
        line = line.strip()
    
        parts = line.split("#", 1)
        
        key   = parts[0].strip()
        value = parts[1].strip()
    
        if key not in flashcards:
            flashcards[key] = []
            
        flashcards[key].append(value)
        
    all_keys = list(sorted(flashcards.keys()))

    return flashcards, all_keys

# --- main ---

# - before loop -

# because words `key` and `keys` are very similar and it is easy to make mistake in code - so I added prefix `all_`
flashcards, all_keys = read_data()
    
print("#########")

# - loop -

while True:
    print() # empty line to make output more readable
    enter = input("Searching nemo (or command: !keys, !exit): ").strip().lower()
    print() # empty line to make output more readable

    if enter == '!exit':
        break
    
    elif enter == '!keys':
        #print( "\n".join(all_keys) )
        for key in all_keys:
            print('key>', key)
    
    elif enter.startswith('!'):
        print('unknown command:', enter)
        
    else:
        # keys which have `enter` only at 
        #selected_keys = list(filter(lambda text: text.startswith(enter), all_keys))
        
        # keys which have `enter` in any place (at the beginning, in the middle, at the end)
        selected_keys = list(filter(lambda text: enter in text, all_keys))
        
        print('selected_keys:', selected_keys)
        
        if selected_keys:  # instead of `0 < len(selected_keys)`
            for key in selected_keys:
                # `selected_keys` has to exist in `flashcards` so there is no need to check if `key` exists in `flashcards`

                print(key, '=>', flashcards[key])
        else: 
            print("NONEsense... nothing here")
        
# - after loop -

print('bye')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM