我有以下问题:
list1=['xyz','xyz2','other_randoms']
list2=['xyz']
我需要找到list2的哪些元素在list1中。实际上,list1的元素对应于我需要获得然后改变的数值。问题是'xyz2'包含'xyz',因此也与正则表达式匹配。
到目前为止我的代码(其中'data'是python字典,'specie_name_and_initial_values'是列表,其中每个子列表包含两个元素,第一个是specie名称,第二个是与它一起的数值):
all_keys = list(data.keys())
for i in range(len(all_keys)):
if all_keys[i]!='Time':
#print all_keys[i]
pattern = re.compile(all_keys[i])
for j in range(len(specie_name_and_initial_values)):
print re.findall(pattern,specie_name_and_initial_values[j][0])
我尝试过的正则表达式的变体包括:
pattern = re.compile('^'+all_keys[i]+'$')
pattern = re.compile('^'+all_keys[i])
pattern = re.compile(all_keys[i]+'$')
我也尝试使用'in'作为限定符(即在for循环中)
非常感谢任何帮助。感谢
Ciaran
---------- ------------ EDIT
澄清。我目前的代码如下。它在类/方法之类的结构中使用。
def calculate_relative_data_based_on_initial_values(self,copasi_file,xlsx_data_file,data_type='fold_change',time='seconds'):
copasi_tool = MineParamEstTools()
data=pandas.io.excel.read_excel(xlsx_data_file,header=0)
#uses custom class and method to get the list of lists from a file
specie_name_and_initial_values = copasi_tool.get_copasi_initial_values(copasi_file)
if time=='minutes':
data['Time']=data['Time']*60
elif time=='hour':
data['Time']=data['Time']*3600
elif time=='seconds':
print 'Time is already in seconds.'
else:
print 'Not a valid time unit'
all_keys = list(data.keys())
species=[]
for i in range(len(specie_name_and_initial_values)):
species.append(specie_name_and_initial_values[i][0])
for i in range(len(all_keys)):
for j in range(len(specie_name_and_initial_values)):
if all_keys[i] in species[j]:
print all_keys[i]
从pandas返回的表就像字典一样被访问。我需要转到我的数据表,提取标题(即all_keys位),然后在specie_name_and_initial_values变量中查找标题的名称并获取相应的值(specie_name_and_initial_value变量中的第二个元素)。在此之后,我将我的数据表的所有值乘以为每个匹配元素获得的值。
我最有可能过于复杂化。你有更好的解决方案吗?
感谢
----------编辑2 ---------------
好的,下面是我的变量
all_keys = set([u'Cyp26_G_R1',u'Cyp26_G_rep1',u'Time'])
species = set(['[Cyp26_R1R2_RARa]','[Cyp26_SRC3_1]','[18-OH-RA]','[p38_a]','[Cyp26_G_rep1]','[Cyp26]','[ Cyp26_G_a]','[SRC3_p]','[mRARa]','[np38_a]','[mRARa_a]','[RARa_pp_TFIIH]','[RARa]','[Cyp26_G_L2]','[atRA] ','[atRA_c]','[SRC3]','[RARa_Ser369p]','[p38]','[Cyp26_mRNA]','[Cyp26_G_L]','[TFIIH]','[Cyp26_SRC3_2]', '[Cyp26_G_R1R2]','[MSK1]','[MSK1_a]','[Cyp26_G]','[Basal_Kinases]','[Cyp26_R1_RARa]','[4-OH-RA]','[Cyp26_G_rep2] ','[Cyp26_Chromatin]','[Cyp26_G_R1]','[RXR]','[SMRT]'])
答案 0 :(得分:2)
您不需要正则表达式来查找公共元素,set.intersection会在list2中找到同样位于list1中的所有元素:
list1=['xyz','xyz2','other_randoms']
list2=['xyz']
print(set(list2).intersection(list1))
set(['xyz'])
此外,如果您想将'xyz'
与'xyz2'
进行比较,则不会使用==
,然后它会正确返回False。
您还可以更简洁地重写自己的代码:
for key in data:
if key != 'Time':
pattern = re.compile(val)
for name, _ in specie_name_and_initial_values:
print re.findall(pattern, name)
根据您的编辑,您以某种方式设法将列表转换为字符串,一个选项是剥离[]
:
all_keys = set([u'Cyp26_G_R1', u'Cyp26_G_rep1', u'Time'])
specie_name_and_initial_values = set(['[Cyp26_R1R2_RARa]', '[Cyp26_SRC3_1]', '[18-OH-RA]', '[p38_a]', '[Cyp26_G_rep1]', '[Cyp26]', '[Cyp26_G_a]', '[SRC3_p]', '[mRARa]', '[np38_a]', '[mRARa_a]', '[RARa_pp_TFIIH]', '[RARa]', '[Cyp26_G_L2]', '[atRA]', '[atRA_c]', '[SRC3]', '[RARa_Ser369p]', '[p38]', '[Cyp26_mRNA]', '[Cyp26_G_L]', '[TFIIH]', '[Cyp26_SRC3_2]', '[Cyp26_G_R1R2]', '[MSK1]', '[MSK1_a]', '[Cyp26_G]', '[Basal_Kinases]', '[Cyp26_R1_RARa]', '[4-OH-RA]', '[Cyp26_G_rep2]', '[Cyp26_Chromatin]', '[Cyp26_G_R1]', '[RXR]', '[SMRT]'])
specie_name_and_initial_values = set(s.strip("[]") for s in specie_name_and_initial_values)
print(all_keys.intersection(specie_name_and_initial_values))
哪个输出:
set([u'Cyp26_G_R1', u'Cyp26_G_rep1'])
仅供参考,如果您在集合中有列表,则会因为列表可变而导致错误,因此无法清除。