我是python和这个论坛的新手:) 我一直在努力学习字典,并且可以真正使用一些帮助。
对于我的问题,输入是:
frontier = [
{ 'state': (2, 5, 4, 3, 0, 1), 'path': [ 'PULL' ] },
{ 'state': (2, 4, 5, 0, 3, 1), 'path': [ 'SWAP','PULL' ] },
{ 'state': (2, 5, 4, 0, 1, 3), 'path': [ 'SWAP' ] },
{ 'state': (2, 0, 5, 4, 3, 1), 'path': [ 'PUSH', 'PUSH' ] },
]
我们被告知每个动作的指定值:
翻转:2
例如。如果[推,交换] = 5 + 8
对于这个问题,每个州都有一个我计算过的指定值(启发式)。
然而,计算行动的价值令我感到难过。我已经尝试通过拆分项目['path']进行编码,但是它创建的列表无法使用。 我不知道如何处理这个问题。
我想列出一个动作列表。对于上述问题,它将看起来:
[6, 14, 8, 10]
有人可以告诉我如何通过给定示例的解释和代码来实现它吗?
答案 0 :(得分:1)
这是一种方式。
frontier = [{ 'state': (2, 5, 4, 3, 0, 1), 'path': [ 'PULL' ] },
{ 'state': (2, 4, 5, 0, 3, 1), 'path': [ 'SWAP','PULL' ] },
{ 'state': (2, 5, 4, 0, 1, 3), 'path': [ 'SWAP' ] },
{ 'state': (2, 0, 5, 4, 3, 1), 'path': [ 'PUSH', 'PUSH' ] }]
d = {'PUSH': 5, 'PULL': 6, 'SWAP': 8, 'FLIP': 2}
res = [sum(map(d.get, item['path'])) for item in frontier]
print(res)
[6, 14, 8, 10]
<强>解释强>
sum
与map
一起使用,懒洋洋地计算字典中所有操作的总和。答案 1 :(得分:1)
试试这个:
result = []
for item in frontier:
item_path_value = 0
for action in item['path']:
item_path_value += action.value
result.append(item_path_value)
其中action.value
应该返回该特定操作的值
答案 2 :(得分:0)
试试这个:
frontier = [
{ 'state': (2, 5, 4, 3, 0, 1), 'path': [ 'PULL' ] },
{ 'state': (2, 4, 5, 0, 3, 1), 'path': [ 'SWAP','PULL' ] },
{ 'state': (2, 5, 4, 0, 1, 3), 'path': [ 'SWAP' ] },
{ 'state': (2, 0, 5, 4, 3, 1), 'path': [ 'PUSH', 'PUSH' ] },
]
d = dict(PUSH=5, PULL=6, SWAP=8, FLIP=2)
out = [sum(d.get(i,0) for i in x['path']) for x in frontier]
print(out)
返回:
[6, 14, 8, 10]
.get(key, default)
功能是你的朋友。它将从给定键的字典中获取值,如果未找到则返回默认值。我们对字典值path
中的所有项目进行求和。
答案 3 :(得分:0)
如果您要查找每条路径的总和,请创建一个存储每个操作值的字典:
frontier = [{'path': ['PULL'], 'state': (2, 5, 4, 3, 0, 1)}, {'path': ['SWAP', 'PULL'], 'state': (2, 4, 5, 0, 3, 1)}, {'path': ['SWAP'], 'state': (2, 5, 4, 0, 1, 3)}, {'path': ['PUSH', 'PUSH'], 'state': (2, 0, 5, 4, 3, 1)}]
actions = {'PUSH': 5, 'PULL': 6, 'SWAP': 8, 'FLIP': 2}
final_dict = [{**b, **{'path':sum(actions.get(i) for i in b['path'])}} for b in frontier]
输出:
[{'state': (2, 5, 4, 3, 0, 1), 'path': 6}, {'state': (2, 4, 5, 0, 3, 1), 'path': 14}, {'state': (2, 5, 4, 0, 1, 3), 'path': 8}, {'state': (2, 0, 5, 4, 3, 1), 'path': 10}]
对于精简结果:
print([i['path'] for i in final_dict])
输出:
[6, 14, 8, 10]
答案 4 :(得分:0)
您可以尝试这种方法:
frontier = [
{ 'state': (2, 5, 4, 3, 0, 1), 'path': [ 'PULL' ] },
{ 'state': (2, 4, 5, 0, 3, 1), 'path': [ 'SWAP','PULL' ] },
{ 'state': (2, 5, 4, 0, 1, 3), 'path': [ 'SWAP' ] },
{ 'state': (2, 0, 5, 4, 3, 1), 'path': [ 'PUSH', 'PUSH' ] },
]
data = {'PUSH': 5, 'PULL': 6, 'SWAP': 8, 'FLIP': 2}
for j,i in enumerate(frontier):
actions=[]
for k in i['path']:
actions.append(data[k])
frontier[j]['path']=sum(actions)
print(frontier)
输出:
[{'state': (2, 5, 4, 3, 0, 1), 'path': 6}, {'state': (2, 4, 5, 0, 3, 1), 'path': 14}, {'state': (2, 5, 4, 0, 1, 3), 'path': 8}, {'state': (2, 0, 5, 4, 3, 1), 'path': 10}]