将Python字典转换为List [complex]

时间:2018-04-16 21:41:47

标签: python list dictionary

我是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' ] },

            ]

我们被告知每个动作的指定值:

  • PUSH:5
  • 拉:6
  • SWAP:8
  • 翻转:2

    例如。如果[推,交换] = 5 + 8

对于这个问题,每个州都有一个我计算过的指定值(启发式)。

然而,计算行动的价值令我感到难过。我已经尝试通过拆分项目['path']进行编码,但是它创建的列表无法使用。 我不知道如何处理这个问题。

我想列出一个动作列表。对于上述问题,它将看起来:

[6, 14, 8, 10]

有人可以告诉我如何通过给定示例的解释和代码来实现它吗?

5 个答案:

答案 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]

<强>解释

  • 创建将操作映射到值的字典。
  • summap一起使用,懒洋洋地计算字典中所有操作的总和。
  • 使用列表推导来遍历列表中的每个字典。

答案 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}]