从将表示列表的字符串转换回列表中删除剩余的字符串指示符?

Strip remaining string indicators from converting string representing a list back into a list?

提问人:AAAddams 提问时间:7/23/2023 最后编辑:AAAddams 更新时间:7/24/2023 访问量:77

问:

我有一个 listdict 正在从 csv 中读取,用于训练营实验室中使用的函数,仅限于基本函数和内置模块和库。我正在制作类似于一组抽认卡的东西。

one_dict = [{'Question':'onevalue','Answers':['an_val','two_val','3rd_val'],'Correct Answer':'two_val'}]

我正在阅读它,需要在答案中添加标签供用户输入 例如: [1]'an_val' [2] 'two_val'...等 如果用户输入为“1”,则测试“an_val”键“正确答案”

现在,我正在努力格式化问答组合以呈现给用户,并且非常卡住了。此函数位于类中,该类现在不执行任何操作,并且已将 init 设置为 pass。用户必须输入用逗号分隔的答案,因此它必须考虑所有数据类型。

def return_q(self,one_dict):
        #takes a dictionary and looks for "Question" and "Answers" as keys
        #Answers should be list so index counter puts answers list into a dictionary
        #answers = 1:option 2:option 3:option for the purposes of user input
        q_retrive = one_dict[0]['Question']
        index = 0
        answer_dict = {}
        adict = one_dict[0]['Answers']
        1st print(adict)
        adict = adict[1:-1].split(',')
        2nd print(adict)
        for answer in adict:
            index +=1
            answer_dict[index] = answer
        return (q_retrive,answer_dict)

这成功地返回了一个列表,但有两个引号在第一个和尾随的答案中徘徊。 第二次打印将使用我们的one_dict [“'an_val”, 'two_val', “3rd_val'”] 返回此值 回报将产生('question', {1: "'an_val", 2: 'two_val', 4: "3rd_val'"})

我环顾四周,显然已经尝试了我在这里和其他地方的许多帖子中看到的东西。我还尝试了一个简单的 if else 循环,看看我是否可以让一些东西正常工作。adict[1:-1].split(',')

 adict = adict[1:-1].split(',')
        print(adict)
        for answer in adict:
            if '"' in answer:
                answer.strip('"')
            elif "'" in adict:
                answer.strip("'")
            else:
                pass
            index +=1
            answer_dict[index] = answer
        return (q_retrive,answer_dict)

我也尝试过 eval(),尽管它在技术上并不安全

adict1 = one_dict[0]['Answers']
        print(adict1)                       #print the list pulled from the Answers key
        adict = eval(adict1)                #evaluate it
        print(adict)                        #print after evaluation
        print(adict1 == adict)              #is this the same thing?

这导致

['1,2,3,4']
['1,2,3,4']
False

这不仅令人困惑。

由于我的功课限制(主要是使用其他库和 pandas 和 ast recs),我没有弄乱所有选项,但我觉得我错过了一些简单的东西。如果有人能帮我去掉最后的引号,我将不胜感激。

python-3.x csv 字典 数据操作

评论

0赞 Michael Butscher 7/23/2023
与什么有关?是一样的吗?one_dictex_listdict
0赞 AAAddams 7/23/2023
是的,对不起。one_dict只是需要传递的函数变量。对于示例,我制作了一个示例字典。您可以替换为我已经编辑了它以反映这一点one_dictex_listdict
0赞 Michael Butscher 7/23/2023
根据 的定义,(因此暂时)将是一个包含三个字符串的列表。因此,将是一个没有方法的字符串的列表。第一个代码片段将失败并出现异常。one_dictone_dict[0]['Answers']adictadict[1:-1]split
0赞 AAAddams 7/23/2023
链接 如果您愿意,请随时暂停进行比较。据我所知,这是相同的代码,但并非不可能。

答:

0赞 richard 7/23/2023 #1

内置的枚举函数将有助于完成您尝试完成的任务。它接受一个可迭代对象并返回一个元组,其中包含一个计数(从默认为 0 的 start 开始)和通过迭代可迭代对象获得的值。

from random import choice


questions = [
    {'Question':'onevalue','Answers':['an_val','two_val','3rd_val'],'Correct Answer':'two_val'},
    {'Question':'two_value','Answers':['an_val','two_val','3rd_val'],'Correct Answer':'two_val'},
    {'Question':'3value','Answers':['an_val','two_val','3rd_val'],'Correct Answer':'two_val'},
    ]


def return_q(one_dict):
    #takes a dictionary and looks for "Question" and "Answers" as keys
    #Answers should be list so index counter puts answers list into a dictionary
    #answers = 1:option 2:option 3:option for the purposes of user input
    question, answer = one_dict['Question'], one_dict['Correct Answer']
    answer_dict = dict(enumerate(one_dict['Answers'], start=1))
    # answer_dict = {1:'option', 2:'option', 3:'option'}
    return question, answer_dict, answer


def main():

    question, answer_dict, answer = return_q(choice(questions))
    
    print(f'Question: {question}?')
    for key, val in answer_dict.items(): print(f'{key:.>4}', val)
    user_input = int(input('\n>>>? '))     # need to be int to match answer_dict keys
    if answer_dict[user_input] == answer:  # match value in answer_dict agaist return_q answer
        print('Correct')
    else:
        print('Incorrect')


if __name__ == '__main__': main()

输出:

Question: onevalue?
...1 an_val
...2 two_val
...3 3rd_val

>>>? 2
Correct

评论

0赞 AAAddams 7/24/2023
感谢!我一直在使用您发送的代码。 1)answer_dict在这种情况下,它不是解析为列表,而是解析为表示列表的字符串,因此2)对不起,我不理解这一行。主要是印刷声明。你能告诉我这是在做什么吗?我会继续戳,但任何进一步的建议都会有所帮助。answer_dict == {1: '[', 2: "'", 3: '1', 4: ',', 5: '2', 6: ',', 7: '3', 8: ',', 9: '4', 10: "'", 11: ']'}for key, val in answer_dict.items(): print(f'{key:.>4}', val)
0赞 AAAddams 7/24/2023
进一步的 @richard 和 @MichaelButscher 都改变了东西,但是当我以这种方式运行它时,它会抛出一个 TypeError“列表索引必须是整数或切片,而不是 str”,是否有原因它对你们两个有用,但对你运行它时对我不起作用?我觉得我可能在这里也错过了一些东西。one_dict['Question']one_dict[0]['Question']
0赞 richard 7/24/2023 #2

因为有些流浪汉指责我在这个答案中使用 GPT https://stackoverflow.com/a/76749747 并摆弄了我的帐户,所以我甚至无法回复他们的评论,我不得不使用一个新的答案/帐户,而不是在我的第一个答案下回复您的评论。

我改成的原因是,将你的函数传递一个包含 1 个字典项的列表,然后必须将其引用为索引 0对我来说意义不大。只需通过单个字典即可。one_dict['Question']one_dict[0]['Question']

for key, val in answer_dict.items(): print(f'{key:.>4}', val)只是一个浓缩为一行的循环,使用 F-strings' 将键格式化为固定宽度。这给出了问题后面的选项列表。for

  1. 在此实例中,answer_dict不是解析为列表,而是解析为表示列表的字符串

代码有效,请参阅 https://onlinegdb.com/o2uXewSRI。 是一个字典,而不是一个列表或字符串,所以我不确定你是否使用相同的代码。answer_dict