代码之家  ›  专栏  ›  技术社区  ›  lte__

Python:检查列表中是否有子字符串的优雅解决方案?

  •  1
  • lte__  · 技术社区  · 8 年前

    在你结束这篇文章之前,请试着理解这个问题-这有点不同,但看起来有很多被否决的问题。

    我正在寻找一种简单的方法来检查字符串的子字符串是否在字符串列表中。输入如下 2018_JAN_BGD ,我想将其中的月份信息转换为(年)季度信息。例如,Q1将是1月、2月和3月。所以我在寻找一种方法来检查 2018年1月11日 包含 JAN , FEB MAR . 我可以用or写12(全年)if-else子句来实现这一点,但我觉得Python中有一个更优雅的解决方案。我正在尝试:

    def tellQuarter(month):
        Q1 = ('JAN','FEB','MAR')
        Q2 = ('APR','MAY','JUN')
        Q3 = ('JUL','AUG','SEP')
        Q4 = ('OCT','NOV','DEC')
        if any(for mon in Q1 in month):
            return ("Q1")
        if any(for mon in Q2 in month):
            return ("Q2")
    

    这当然是不正确的(无效语法),但我不知道如何正确地表达它。基本上,我想循环 Q1 ,并检查是否有任何字符串是 month .

    我是说我能做到

    for mon in Q1:
        if mon in month:
            return "Q1"
    

    但是,难道没有一种更优雅的单线解决方案吗?

    3 回复  |  直到 8 年前
        1
  •  3
  •   Lanting    8 年前

    作弊,但使用字典,将月份映射到季度:

    monthsToQuarters = {
        'JAN': 'Q1','FEB': 'Q1','MAR': 'Q1',
        'APR': 'Q2','MAY': 'Q2','JUN': 'Q2',
        'JUL': 'Q3','AUG': 'Q3','SEP': 'Q3',
        'OCT': 'Q4','NOV': 'Q4','DEC': 'Q4'}
    

    为您提供:

    >>> monthsToQuarters['JAN']
    'Q1'
    

    您可以使用以下方法删除月份:

    >>> '2018_JAN_BGD'.split('_')[1]
    'JAN'
    
        2
  •  2
  •   javidcf    8 年前

    避免使用dict重复逻辑:

    QUARTERS = {
        'Q1': ('JAN', 'FEB', 'MAR'),
        'Q2': ('APR', 'MAY', 'JUN'),
        'Q3': ('JUL', 'AUG', 'SEP'),
        'Q4': ('OCT', 'NOV', 'DEC'),
    }
    
    def tellQuarter(month):
        for q, months in QUARTERS.items():
            if any(m for m in months if m in month):
                return q
        raise ValueError("String '{}' does not contain a month.".format(month))
    
    print(tellQuarter('2018_JAN_BGD'))
    >>> Q1
    
        3
  •  1
  •   Rakesh    8 年前

    列表理解中出现语法错误

    def tellQuarter(month):
            Q1 = ('JAN','FEB','MAR')
            Q2 = ('APR','MAY','JUN')
            Q3 = ('JUL','AUG','SEP')
            Q4 = ('OCT','NOV','DEC')
            if any(mon in month for mon in Q1):
                return ("Q1")
            if any(mon in month for mon in Q2):
                return ("Q2")
    
    print tellQuarter("2018_JAN_BGD")
    

    输出 :

    Q1