如果两个字符串以特定顺序出现,则从列表中获取元素
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 循环,该循环进入每个列表,然后遍历每个字符串,并查看 A
和 C
是否出现,但我有点困惑关于如何保持出现顺序,即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)
来自@OlvinRoght 的解决方案:
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)
假设我有以下列表
lst=[['AAAB'],['ACAC'],['CABA'],['AACC'],['BACB'],['BCAA'],['CBAA'],['ABBC']]
我需要提取 A
出现然后 C
出现的列表,不考虑它们之间可能存在的其他字母。
因此,结果必须类似于
res=[['ACAC'],['AACC'],['BACB'],['ABBC']]
我可以在另一个 for 循环中实现一个 for 循环,该循环进入每个列表,然后遍历每个字符串,并查看 A
和 C
是否出现,但我有点困惑关于如何保持出现顺序,即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)
来自@OlvinRoght 的解决方案:
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)