这段代码可以缩短吗?机器人,说明和词典

时间:2016-12-30 13:45:56

标签: python dictionary readline

这项任务的想法来自于第10天的代码问世。机器人用数字操纵筹码。说明如下(它们位于 txt 文件中)。

bot 1 gives low to output 1 and high to bot 0
value 5 goes to bot 2
bot 0 gives low to output 2 and high to output 0
bot 2 gives low to bot 1 and high to bot 0
value 3 goes to bot 1
value 2 goes to bot 2

我必须编写一个函数read_file(filename)来读取文件并返回一对(元组)。第一个元素是初始状态,第二个元素是指令。

举个例子:

此示例中的初始状态为:{1: [3], 2: [5, 2]}

,说明为{0: (('output', 2), ('output', 0)), 1: (('output', 1), ('bot', 0)), 2: (('bot', 1), ('bot', 0))}

这就是我解决它的方式。

bots = dict()
instructions = dict()
with open("example.txt") as f:
    linez = f.readlines()

for line in linez:
    line = line.strip()
    data = line.split(" ")
    if line.startswith("value"):
        value = int(data[1])
        bot = int(data[5])

        if bot not in bots:
            bots[bot] = []
        bots[bot].append(value)

    elif line.startswith("bot"):
        bot = int(data[1])
        low = (data[5], int(data[6]))
        high = (data[10], int(data[11]))
        instructions[bot] = (low, high)

我想知道,如果有一种更短的方式来解决这个问题?

2 个答案:

答案 0 :(得分:1)

正如上面的评论所说 - 不确定您是否需要更短的更快的代码。

您可以为更短的代码执行的操作是使用defaultdict,因此您无需明确检查字典中是否存在某个键:

from collections import defaultdict
bots = defaultdict(list) # the param says what should be the default value

# the following three lines will be replaced with the line below
# if bot not in bots:
#     bots[bot] = []
# bots[bot].append(value)
bots[bot].append(value)

然后是一件小事 - 以下两行line = line.strip(); data = line.split(" ")可以替换为data = line.strip().split()

答案 1 :(得分:0)

替换它:

with open("example.txt") as f:
    linez = f.readlines()

for line in linez:
    # code here

使用:

with open("example.txt") as f:
    for line in f:
        # code here

它们都更短(嗯,不是很多,但......)和更高的内存效率;)