在python中附加到列表会引发

2024-04-24 04:16:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python相当陌生,我要做的是:

  1. 读取文件
  2. 为每一行向字典中添加元素
  3. 如果键已经存在,那么将它们的值获取到一个列表中,并将新值附加到列表中。在
  4. 使用新的值列表更新字典

这是我的代码:

jobChangeMap=dict() # Maps the changed job name. Format will be      jobset,originaljob,jobNumber:jobset,changedjob,jobnumber
jobValues = []

if(not jobsetName in jobsetJobMap.keys()):
    logger.debug("{0} not found as a key. Adding key and value pair".format(jobsetName))
    jobsetJobMap.update({jobsetName:jobName+","+jobNumber})
    logger.debug(jobsetJobMap)
else:
    jobValues = []
    jobValues[:]=[]
    logger.debug("{0} already found as a key. Getting list of values for key".format(jobsetName))
    jobValues=jobsetJobMap[jobsetName]
    logger.debug("Number of values for {0} is {1}".format(jobsetName,jobValues.count))
    logger.debug(jobsetJobMap)
    if(not jobName in jobValues):
        myJobName=jobName+","+jobNumber
        logger.debug("Size before adding: {0}".format(len(jobValues)))
        jobValues.append(myJobName)

这是引发以下错误的行:

^{2}$

为什么Python抱怨jobValues是str对象,尽管我明确地将它定义为type list?在


Tags: keyindebugformat列表if字典not
3条回答

关于你的错误。@杰兹回答完美地解释了这一点。在

显然,您对python还不熟悉,而且您已经在Java/C世界中生活了太久。JK。在

我为什么这么说?在

首先,您使用的变量命名约定(CamelCase)是so[Java/C#]-样式。你应该喜欢python上的snack_case。有关更多信息,请参阅Style Guide for Python Code。在

在这类程序中使用python是正确的。因为python在处理此类问题时非常强大。但是,您并没有充分利用python的能力。这不应该占用这么多代码行。在

保持数据结构的一致性。在jobsetJobMap中,存储的是字符串或数组。您可能希望将它们全部保存为数组,即使它们只包含一个元素。异构数据导致更多的代码,更多的代码等于更多的bug。在

我会建议这样的。在

#!/usr/bin/env python

lines = ['name1,1', 'name2,2', 'name1,3', 'name2,1', 'name3,1', 'name3,1']

jobs_map = {}

for line in lines:
    [name, number] = line.split(',', 1)
    if name in jobs_map:
        jobs_map[name].append("%s,%s" % (name, number))
    else:
        jobs_map[name] = ["%s,%s" % (name, number)]

我想我找到了解决这个问题的方法。这可能不是最聪明的代码,但这是我用Python解决方案的尝试

if(not jobsetName in jobsetJobMap.keys()):
                    jobValues = []
                    myNewJobName=jobName+","+jobNumber
                    jobValues.append(myNewJobName)
                    logger.debug("{0} not found as a key. Adding key and value pair".format(jobsetName))
                    jobsetJobMap.update({jobsetName:jobValues})
                    logger.debug(jobsetJobMap)
                else:
                    jobValues = []

                    logger.debug("{0} already found as a key. Getting list of values for key".format(jobsetName))
                    jobValues=jobsetJobMap.get(jobsetName) # Get list of values associated with the key.


                    logger.debug(jobsetJobMap)
                    if(not jobName in jobValues):
                        myJobName=jobName+","+jobNumber
                        logger.debug("Size before adding: {0}".format(len(jobValues)))
                        jobValues.append(myJobName)
                        jobsetJobMap.update({jobsetName:jobValues})

                    else:
                        jobCount=jobValues.count(jobName)
                        logger.debug("Job {0} already exists in the list. Adding a unique name")
                        newJobName=jobName+".M"+jobCount+","+jobNumber
                        logger.debug("{0} changed to {1}".format(jobName,newJobName))
                        jobChangeMap.update({jobsetName+","+jobName+","+jobNumber:jobsetName+","+newJobName+","+jobNumber})
                        jobValues.append(newJobName)
                        jobsetJobMap.update({jobsetName: jobValues})

jobsetJobMap的值根据这一行显示为字符串:

jobsetJobMap.update({jobsetName:jobName+","+jobNumber})

它用一个新的字符串jobName+","+jobNumber覆盖条目jobName+","+jobNumber,稍后将其检索并设置为jobValues的值:

^{pr2}$

它用一个字符串覆盖jobValues的前一个list值,字符串没有{}方法,因此会出现错误消息。在

从变量名推断出你的意图,我认为你想做的是:

# (earlier initialization)
import collections
jobsetJobMap = collections.defaultdict(list)
# ...
# (later update):
    jobsetJobMap[jobsetName].append( jobName + "," + jobNumber )

它将作业描述符附加到与jobsetJobMap字典中的键jobsetName关联的列表(如果需要,隐式创建列表)。在

相关问题 更多 >