簡體   English   中英

Python:如果value是元組/列表而不是字符串,我該如何迭代

[英]Python: how do I iterate only if value is a tuple/list and not a string

我目前正在嘗試編寫一個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'字符串變成一個元組,所以_translateMap看起來像這樣:

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

否則,你可以每次檢查isinstance的類型,如下所示:

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測試該值是否為字符串:

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

您不需要pass init dunder方法。 - 另外,縮寫是python最重要的方面,因為它根據后者解釋代碼。 - 您可以在不使用單引號(字符串)的情況下將數字傳遞給函數。

你可以做以下幾點:

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

雖然我不明白為什么你將priority字段設置為元組,但你可以這樣做:

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函數中。

我不確定您的用例,但這會打印出您想要的結果。 您不需要遍歷變量。 只需首先映射您想要的所有內容。

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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM