如果两个字符串以特定顺序出现,则从列表中获取元素

Get elements from lists if two strings appear in a certain order

假设我有以下列表

lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]

我需要提取 A 出现然后 C 出现的列表,不考虑它们之间可能存在的其他字母。

因此,结果必须类似于

res=[['ACAC'],['AACC'],['BACB'],['ABBC']]

我可以在另一个 for 循环中实现一个 for 循环,该循环进入每个列表,然后遍历每个字符串,并查看 AC 是否出现,但我有点困惑关于如何保持出现顺序,即A出现在C

之前
lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]

out = [[i] for (i, ) in lst if 'A' in i and 'C' in i and i.index('A') < i.index('C')]
print(out)

打印:

[['ACAC'], ['AACC'], ['BACB'], ['ABBC']]

或使用re:

import re

r = re.compile(r'A.*C')

lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]

out = [[i] for (i, ) in lst if r.search(i)]
print(out)

来自@OlvinR​​oght 的解决方案:

lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]
res = [i for i in lst if len(i[0]) > i[0].find('C') - i[0].find('A') > 0]

print(res)

尝试以下操作:(已编辑以说明不包含字符 'A' 或 'C' 的列表)

lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]

res = []

for lst_inner in lst:
    if ('A' in lst_inner[0] and 'C' in lst_inner[0] and
        lst_inner[0].find('A') < lst_inner[0].find('C')):
        
        res.append(lst_inner)

print(res)

扩展@andrej 正则表达式解决方案

import re
r = list(filter(lambda x: [i for i in x if re.findall('A.*C', i)], l))

一个non-regex,解

def find_patt(lis):
    res =[]
    for sublis in lis:
        tmp =[]
        for ele in sublis:
            if ('A' in ele) and ('C' in ele):
                if ele.index('A')<len(ele)-ele[::-1].index('C'):
                    tmp.append(ele)
        if tmp!=[]:
            res.append(tmp)
            tmp =[]
    return res

lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC'], ['CAC']]

print(find_patt(lst))
# [['ACAC'], ['AACC'], ['BACB'], ['ABBC'], ['CAC']]
print("Hello world")

inputList=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]
print(inputList)

matchingCharactersInOrderList = ["A","C"]
filteredList=[]

for subList in inputList:
    tempStringToMatchOrder=""
    tempStringToMatchOrder = tempStringToMatchOrder.join(subList)
    if  matchingCharactersInOrderList[0] in tempStringToMatchOrder:
        partitionedString = tempStringToMatchOrder.partition(matchingCharactersInOrderList[0])[2]
        if matchingCharactersInOrderList[1] in partitionedString:
            filteredList.append(subList)
#matching = [s for s in lst if ("A" in s)]

print(filteredList)

试试这个

lst =[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]
res = []

def check(list_string):
    index1=0
    index2=0
    for letters in list_string:
        if letters == 'A':
            index1 = list_string.index(letters)
            break
    for letters in list_string:
        if letters =='C':
            index2 = list_string.index(letters)
            break
    if index1 < index2:
        return True
    elif index1 > index2:
        return False
    else:
        return False


for x in lst:
    string = x[0]
    string_splitted = list(string)
    if check(string_splitted):
        res.append(x)
print(res)