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

时间:2018-02-20 12:20:39

标签: python string

在你关闭这个之前,请尝试理解这个问题 - 它有点不同,但看起来像很多低调的问题。

我正在寻找一种简单的方法来检查字符串的任何子字符串是否在字符串列表中。输入类似2018_JAN_BGD,我想将此月信息转换为(年)季度信息。例如Q1将是1月,2月和3月。所以我正在寻找一种方法来检查2018_JAN_BGD中的任何子字符串是否包含JANFEBMAR。我可以通过编写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 个答案:

答案 0 :(得分:3)

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

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'

答案 1 :(得分:3)

避免用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

答案 2 :(得分:2)

您的列表理解中出现语法错误

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