使用字典值

时间:2017-06-01 21:05:47

标签: python dictionary string-formatting

在使用字典值尝试创建字符串时,我遇到了一个奇怪的问题。基本上,我有一个函数可以打开文件,读取一行,并将它在该行中找到的值存储在字典中。然后,它将这些值发送到外部程序。这是代码:

def createLandscapes(file):

  landscapeParameters = {'FILE': "NULL",
                         'N': "NULL",
                         'K': "NULL",
                         'NUM': "100"}

  for line in file:
    if line == "END LANDSCAPES\n":
      break
    else:
      parameters = line.replace(" ", '').split(",")

      for parameter in parameters:
        parameter = parameter.split("=")
        if parameter[0] not in landscapeParameters:
          malformedFile()
        landscapeParameters[parameter[0]] = parameter[1]

      for key in landscapeParameters:
        if landscapeParameters[key] == "NULL":
          malformedFile()

      # This print statment is for diagnostic purposes
      print("./generateScoreTables {} {} {} {}".format(landscapeParameters['FILE'],
                                                       landscapeParameters['N'],
                                                       landscapeParameters['K'],
                                                       landscapeParameters['NUM']))

      os.system("./generateScoreTables {} {} {} {}".format(landscapeParameters['FILE'],
                                                           landscapeParameters['N'],
                                                           landscapeParameters['K'],
                                                           landscapeParameters['NUM']))

为了清楚起见,该函数以单个逗号分隔的行查找一系列参数输入,格式为

FILE=example, N=20, K=5, NUM=100

它会接受这些输入并覆盖landscapeParameters中的默认输入(如果已指定),并使用landscapeParameters中的值来调用外部程序。

奇怪的是,当我使用landscapeParameters中的默认参数时,字符串格式似乎无法正常工作。我的意思是,如果函数读取行:

FILE=example, N=20, K=5, NUM=100

一切正常,print语句打印:

./generateScoreTables example 20 5 100

但是,如果函数读取行:

FILE=example, N=20, K=5

我离开NUM以使用默认参数时,我得到以下输出:

./generateScoreTables testland1 15
 0 100
Segmentation fault
sh: 2: 0: not found

格式似乎没有正确格式化此字符串,但我不明白为什么。有没有人对此有任何见解?

2 个答案:

答案 0 :(得分:2)

已经向您指出了这个问题,但我仍然无法发表评论,所以我将其分开。这将涉及重新编写代码。

进入这个阶段后:

parameters = ['FILE=example', 'N=20', 'K=5', 'NUM=100']

# make a list of tuples with [(FILE, default), ('N', 20)...]
pars = [x.split("=") for x in parameters]

现在将每个twople转换为字典dict_of_pars

中的Key,value对
dict_of_pars = {k: v for k, v in pars}
#dictionary with values for a single line
# {'FILE': 'example', 'N': '20', 'K': '5', 'NUM': '100'}

此时您将拥有一个字典,其中包含任何特定行的所有已定义参数。如果你创建一个保存默认值的函数(输出),你可以在调用中使用** dict_of_pars发送一行的可用参数

# define output function with default parameters
def output(FILE='example, N='n', K='k', NUM='num'):
      os.system(FILE, N, K, NUM)

现在您可以使用

调用该函数
  output(**dict_of_pars)  #will unpack the arguments into output function

为文件中的每一行创建其中一个临时词典,将其传递给输出。希望这会有所帮助。

答案 1 :(得分:-1)

您在每个循环中更新相同的变量,因此如果它读取的某行没有特定字段,则会使用上次读取它时的值。

而是在循环内声明一个空字典,如果字典中没有键,则使用.get函数设置默认值。

def createLandscapes(file):
    params = ['FILE','N','K','NUM']

    for line in file:
        if line == "END LANDSCAPES\n":
            break
        else:
            landscapeParameters = {}
            parameters = line.replace(" ", '').split(",")

            for parameter in parameters:
                parameter = parameter.split("=")
                if parameter[0] not in params:
                    malformedFile()
                landscapeParameters[parameter[0]] = parameter[1]

                for key in landscapeParameters:
                if landscapeParameters[key] == "NULL":
                    malformedFile()
         os.system("./generateScoreTables {} {} {} {}".format(landscapeParameters.get('FILE',''),
                                                           landscapeParameters.get('N',''),
                                                           landscapeParameters.get('K',''),
                                                           landscapeParameters.get('NUM',100)))

你可能需要稍微调整一下,但它应该会给你更多可预测的结果。