如何将用户输入数据作为字典?

时间:2017-11-27 11:07:59

标签: python dictionary

所以在我的算法中我使用变量来存储一些图形节点。但我想把它作为用户输入。

parents = {'N1': ['N2', 'N3', 'N4'], 'N3': ['N6', 'N7'], 'N4': ['N3'], 'N5': ['N4', 'N8'], 'N6': ['N13'], 'N8': ['N9'], 'N9': ['N11'], 'N10': ['N7', 'N9'], 'N11': ['N14'], 'N12': ['N5']}

上面的代码应如下所示:

parents = list(input("Enter vertices:"))

但这只列出一个清单。我需要一份清单。

1 个答案:

答案 0 :(得分:0)

您可以使用ast模块的literal_eval将表示Python文字的字符串转换为适当的Python对象。来自文档:

  

安全地评估表达式节点或包含Python的字符串   文字或容器显示。提供的字符串或节点可能只是   由以下Python文字结构组成:字符串,字节,   数字,元组,列表,dicts,集合,布尔值和无。

     

这可以用于安全地评估包含Python的字符串   来自不受信任来源的值,无需解析值   自己。它无法评估任意复杂性   表达式,例如涉及运算符或索引。

from pprint import pprint
from ast import literal_eval

s = "{'N1': ['N2', 'N3', 'N4'], 'N3': ['N6', 'N7'], 'N4': ['N3'], 'N5': ['N4', 'N8'], 'N6': ['N13'], 'N8': ['N9'], 'N9': ['N11'], 'N10': ['N7', 'N9'], 'N11': ['N14'], 'N12': ['N5']}"

parents = literal_eval(s)

pprint(parents)

<强>输出

{'N1': ['N2', 'N3', 'N4'],
 'N10': ['N7', 'N9'],
 'N11': ['N14'],
 'N12': ['N5'],
 'N3': ['N6', 'N7'],
 'N4': ['N3'],
 'N5': ['N4', 'N8'],
 'N6': ['N13'],
 'N8': ['N9'],
 'N9': ['N11']}

还有一个名为eval的内置函数可以执行此操作,但您应该从不在不受信任的用户输入上使用eval,因为这不安全。

以下是如何在用户输入上使用literal_eval

from pprint import pprint
from ast import literal_eval

s = input('Enter a node dictionary: ')
parents = literal_eval(s)
pprint(parents)

<强>演示

Enter a node dictionary: {'N1': ['N2', 'N3', 'N4'], 'N3': ['N6', 'N7'], 'N4': ['N3'], 'N5': ['N4', 'N8'], 'N6': ['N13'], 'N8': ['N9'], 'N9': ['N11'], 'N10': ['N7', 'N9'], 'N11': ['N14'], 'N12': ['N5']}
{'N1': ['N2', 'N3', 'N4'],
 'N10': ['N7', 'N9'],
 'N11': ['N14'],
 'N12': ['N5'],
 'N3': ['N6', 'N7'],
 'N4': ['N3'],
 'N5': ['N4', 'N8'],
 'N6': ['N13'],
 'N8': ['N9'],
 'N9': ['N11']}