首页 > 解决方案 > 如何检查列表中字符串的一部分是否包含在Python中的另一个列表中

问题描述

我一直在研究许多问题,这些问题似乎一针见血,但最终让我更加困惑,最终毫无帮助。所以希望没有人结束这个问题并让我参考其他问题,并且实际上对我有所帮助,因为我花了几个小时试图弄清楚它。出于安全原因,我无法提供实际文本,因此我将制作类似的列表。这些列表中有数千个字符串,但我只是举一个 3 的例子,故意放入我想要匹配的字符串。

列表= ['93900 2016-01-11.50 10.17'、'93030 2014-04-16.50 18.83'、'29322 2009-05-21.50 17.81']

list1= ['33492 2017-02-14.50 11.17', '93900 2016-02-11.00 11.15', '93900 2016-12-14.00 15.66']

  1. 列表字符之间的间距不同
  2. 我需要以“list”为例,93900 2016-01-11.50 10.17 并与 list1 中的字符串进行比较,并询问 93900 是否与日期 2016-01-11.50 一起但带有 +-month 缓冲区。所以理想情况下,它会从 list1 返回 '93900 2016-02-11.00 11.15'、'93900 2015-12-14.00 15.66'。我只知道如何比较完全相同或不完全相同的字符串。这更复杂,因为如果我进行比较,它显然会返回一个空列表,因为它们都不匹配。我需要一个更智能的代码,它可以在字符串中查找并允许我查找它附近的值。比较后,我还需要将完整字符串放入新列表,而不是部分字符串。

我希望这是有道理的,并且有人可以提供帮助。

我所拥有的只是一个不起作用的嵌套循环,因为我无法弄清楚如何比较部分字符串。

new_list= [] for line in list: for line1 in list1: if line[0:5] in line1[0:5] new_list.append[line]

是的,这显然不起作用,但它是一种检查列表中每个元素的方法,但不是某些字符。

标签: pythonlist

解决方案


如果缓冲区始终为 1 个月并且数据格式相同,则此代码应该适合您:

def comp(s, l): # string to search, list
    head, month = s.split('-')[0:2] # eg: with s = '93900 2016-01-11.50 10.17' head = '93900 2016' and month = '01'
    head, year = head.split(' ') # head = '93900' year = '2016'
    year = int(year)
    month = int(month)

    # managing edge cases where month is january or december
    if month == 1: 
        y1 = year - 1 
        m1 = 12
    else:
        y1 = year
        m1 = month - 1

    if month == 12:
        y2 = year + 1
        m2 = 1
    else:
        y2 = year
        m2 = month + 1

    # building strings to search for
    s1 = head + ' ' + str(y1) + '-' + str(m1).zfill(2)
    s2 = head + ' ' + str(y2) + '-' + str(m2).zfill(2)

    out = []
    for item in l:
        if s1 in item or s2 in item:
            out.append(item)

    return out

test_s = '93900 2016-01-11.50 10.17'
test_l = ['33492 2017-02-14.50 11.17', '93900 2016-02-11.00 11.15', '93900 2015-12-14.00 15.66']

print(comp(test_s, test_l))

推荐阅读