提问人:AAAddams 提问时间:7/23/2023 最后编辑:AAAddams 更新时间:7/24/2023 访问量:77
从将表示列表的字符串转换回列表中删除剩余的字符串指示符?
Strip remaining string indicators from converting string representing a list back into a list?
问:
我有一个 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),我没有弄乱所有选项,但我觉得我错过了一些简单的东西。如果有人能帮我去掉最后的引号,我将不胜感激。
答:
内置的枚举
函数将有助于完成您尝试完成的任务。它接受一个可迭代对象并返回一个元组,其中包含一个计数(从默认为 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
评论
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)
one_dict['Question']
one_dict[0]['Question']
因为有些流浪汉指责我在这个答案中使用 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
- 在此实例中,answer_dict不是解析为列表,而是解析为表示列表的字符串
代码有效,请参阅 https://onlinegdb.com/o2uXewSRI。 是一个字典,而不是一个列表或字符串,所以我不确定你是否使用相同的代码。answer_dict
评论
one_dict
ex_listdict
one_dict
ex_listdict
one_dict
one_dict[0]['Answers']
adict
adict[1:-1]
split