Python:如何仅在值是元组/列表而不是字符串时进行迭代

Python:如何仅在值是元组/列表而不是字符串时进行迭代,python,Python,我目前正在尝试编写一个python脚本/小应用程序,用来读取事件,然后将它们转换为不同的格式。 我也让我们对面向对象编程有一点涉猎,但我远不是一个专家 我试图使用字典作为映射来定义源字段和转换字段之间的映射 不过,其中一个源字段(示例中的优先级)在输出中需要两次 class event(): def __init__(self, description, priority): self.description = description self.prio

我目前正在尝试编写一个python脚本/小应用程序,用来读取事件,然后将它们转换为不同的格式。 我也让我们对面向对象编程有一点涉猎,但我远不是一个专家

我试图使用字典作为映射来定义源字段和转换字段之间的映射

不过,其中一个源字段(示例中的优先级)在输出中需要两次

class event():
    def __init__(self, description, priority):
        self.description = description
        self.priority = priority

        pass

    _translateMap = {
       'description': 'message',
       'priority' : ('priority', 'severity')
    }

    def translate(self):
       result = {}
       for key, value in self._translateMap.items():
           for field in value:
               result[field] = getattr(self, key)

       return result

if __name__ == '__main__':
    event1 = event('blahblah','3')
    print event1.translate()
这将打印:
{'a':'blahblah','e':'blahblah','severity':'3','g':'blahblah','m':'blahblah','priority':'3','s':'blahblah'}

但我想要的是:
{'message':'blahblah','severity':'3','priority':'3'}

我知道问题是迭代“message”的每个字符,但我不确定在仍然能够解析多个输入值的情况下避免这种情况的最佳方法是什么

或者,我认为它们应该类似地工作,这根本是错误的? 如前所述,我还不是很有经验,所以如果你认为这种方法没有意义,让我知道


提前感谢您,

您可以使用iInstance测试该值是否为字符串:

def translate(self):
    result = {}
    for key, value in self._translateMap.items():
        if isinstance(value,str):
            result[value] = getattr(self, key)
        else:
            for field in value:
                result[field] = getattr(self, key)

    return result

您不需要在
init
dunder方法中使用
pass
此外,缩进是python最重要的方面,因为它解释基于python的代码。-您可以不使用单引号(字符串)将数字传递给函数

您可以通过以下方式进行操作:

def translate(self):
   return {field: getattr(self, value) for value, field in self._translateMap.items()}
虽然我不明白为什么要将
优先级
字段设置为元组,但可以执行以下操作:

class event():
    _translateMap = {
        'description': 'message',
        'priority': 'priority',
        'severity': 'severity'
    }


    def __init__(self, description, priority, severity):
        self.description = description
        self.priority = priority
        self.severity = severity

    def translate(self):
       return {field: getattr(self, value) for value, field in self._translateMap.items()}

if __name__ == '__main__':
    event1 = event('blahblah', 3, 5)
    print(event1.translate())

请注意数字是如何不作为字符串传递的,如果您想在
translate
函数中添加检查,您也可以这样做。

有两种方法可以解决此问题,您可以将“message”字符串转换为元组,因此您的
\u translateMap
如下所示:

_translateMap = {
    'description': ('message',),
    'priority' : ('priority', 'severity')
}
def translate(self):
    result = {}
    for key, value in self._translateMap.items():
        if isinstance(value,str):
            result[value] = getattr(self, key)
        else:
            for field in value:
                 result[field] = getattr(self, key)

    return result
否则,每次都可以使用
isinstance
检查类型,如下所示:

_translateMap = {
    'description': ('message',),
    'priority' : ('priority', 'severity')
}
def translate(self):
    result = {}
    for key, value in self._translateMap.items():
        if isinstance(value,str):
            result[value] = getattr(self, key)
        else:
            for field in value:
                 result[field] = getattr(self, key)

    return result

我希望这有帮助。:)

我不确定您的用例,但这将根据您的需要打印结果。您不需要遍历变量。首先,只需简单地映射您想要的所有内容

class event():
    def __init__(self, description, priority):
        self.description = description
        self.priority = priority
        self.severity = priority

        pass

    _translateMap = {
       'description': 'message',
       'priority' : 'priority',
       'severity': 'severity'
    }

    def translate(self):
       result = {}
       for key, value in self._translateMap.items():
               result[key] = getattr(self, key)

       return result

if __name__ == '__main__':
    event1 = event('blahblah','3')
    print (event1.translate())

您可以检查类型,例如使用
isinstance(object,str)
或者更好的方法是使用
isinstance(object,(str,bytes))
。您可以将“message”放在元组或数组中吗?像
'description':('message')
@DeltaMarine101
('message')
是一个字符串,
('message',)
是一个元组:创建元组的是逗号,只有在没有括号的情况下不明确时才需要括号,或者创建一个空元组。@PM2Ring My bad:/谢谢你的信息,是的,我需要准确查找何时使用pass和yield在我的待办事项列表中:)优先级和严重性在元组中的原因是因为原始事件中没有严重性字段。它只在翻译过程中产生。我可以推荐一本对你有帮助的书吗?阅读《Python食谱-第三版》-。-这是一本很好的书,肯定会帮助你在未来实现你想要的。如果没有严重性,我会将其完全移除。-如果您认为这回答了您的问题,请不要忘记标记正确答案。:)非常感谢,我把所有的值都改成了元组,应该可以用了。我以前试过这样做,但是我没有意识到当你只有一个值时,结尾应该有一个逗号。我很高兴我能帮上忙!考虑接受一个你收到的答案(点击滴答声)✓ 在你最喜欢的答案旁边):@Eav实际上是用逗号表示元组,而不是括号。