我需要有关python和dictionary的帮助。
因此,基本思路是创建一个列表,该列表将在python字典上包含多个值。
我解析dic的每个键,然后如果值的数量> 1,则检查这些值是否包含特定的前缀,如果是,则将不带前缀的值放入列表中。
这是dic:
defaultdict(<class 'list'>, {'ACTGA': ['YP_3878.3', 'HUYUII.1'], 'ACTGT': ['XP_46744.1', 'JUUIIL.2'], 'ACCTTGG': ['YP_8990.1'], 'ACCTTTT': ['YP_8992.1'], 'ATGA': ['YP_9000.1', 'YP_3222.1'], 'AAATTTGG': ['ORAAA.8', 'OTTTAX']})
这是
prefix_list = ["XP_","YP_"]
让我更好地解释一下:
我实际上想创建一个具有值内容的新
sequence_list
。因此,基本思路是遍历每个键,如果有> 1个值,我会根据某些条件将n-1个值放入
sequence_list
中。这是一个例子:
第一个键是
'ACTGA'
,其中有2个值:YP_3878.3
和HUYUII.1
,然后由于HUYUII.1
在prefix_list
中没有任何前缀,因此我将其放入sequence_list
:print(sequence_list):["HUYUII.1"]
第二个键是
'ACTGT'
,其中有3个值:XP_46744.1
,JUUIIL.2
和JUUIIL.3
,然后由于JUUIIL.2
和JUUIIL.3
在prefix_list
中没有任何前缀,因此我将它们放入sequence_list
:print(sequence_list):["HUYUII.1","JUUIIL.2","JUUIIL.3"]
第三个键,其中n值> 1是
'ATGAAA'
,其中有3个值:'YP_9000.1'
,'YP_3222.1'
和'HUU3222.1'
,然后由于HUU3222.1
在prefix_list
中没有任何前缀,因此我将它们放入sequence_list
,并且因为两个前缀都剩下2个值,所以我也将第一个放在sequence_list
中:print(sequence_list):["HUYUII.1","JUUIIL.2","JUUIIL.3","YP_9000.1","HUU3222.1"]
第四个键,其中n值> 1是
'AAATTTGG'
,其中有2个值:'ORLOP.8'
和'OTTTAX'
,然后由于两个键都没有前缀,所以我将第一个键放入prefix_list
:sequence_list
所以最后我应该得到sequence_list,例如:
["HUYUII.1","JUUIIL.2","JUUIIL.3","YP_9000.1","HUU3222.1","ORAAA.8"]
有人有主意吗?我尝试了一些东西,但是这很困难,甚至可能很杂乱:
sequence_list=[]
for value in dedup_records.items():
if(len(value[1]))>1:
try:
length=len(value[1])
liste=value[1]
print("liste1",liste)
r = re.compile("YP_*.|XP_*.")
newlist = list(filter(r.match, liste))
if len(newlist)!=0:
print(newlist)
for i in newlist:
if i in liste:
liste.remove(i)
while len(newlist)>1:
liste.remove(newlist[0])
else:
while len(liste)>1:
liste.pop(0)
print(liste)
except :
continue
for i in liste:
sequence_list.append(i)
最佳答案
您可以通过使用函数使代码更简洁,以便更轻松地读取循环中发生的事情。
另外,仅出于个人喜好,我建议使用list_
作为变量名而不是liste
,因为拼写错误可能很难使用。
该方法是首先将每个列表分为两组:一组带有前缀,一组没有前缀。之后,我们只需要验证至少有1个带前缀的项目(在这种情况下,请添加除最后一个带前缀的项目之外的所有项目,并附加所有非前缀的项目),否则我们需要保留1个非前缀的项目项,然后附加所有其他项。
dedup_records = {'ACTGA': ['YP_3890.3', 'HUYUII.1'], 'ACTGT': ['XP_46744.1', 'JUUIIL.2','JUUIIL.3'], 'ACCTTGG': ['YP_8990.1'], 'ACCTTTT': ['YP_8992.1'], 'ATGAAA': ['YP_9000.1', 'YP_3222.1','HUU3222.1'], 'AAATTTGG': ['ORLOP.8', 'OTTTAX']}
prefix_list = ["XP_","YP_"]
def separate_items_with_prefix(list_, prefix_list):
'''separates a list into two lists based on prefix
returns two lists: one for items with prefix
another for items without prefix
'''
with_prefix = []
without_prefix = []
for item in list_:
if any(item.startswith(prefix) for prefix in prefix_list):
with_prefix.append(item)
else:
without_prefix.append(item)
return with_prefix, without_prefix
sequence_list = []
for val in dedup_records.values():
if len(val) <= 1:
continue #skip items with only upto 1 value in them
with_prefix, without_prefix = separate_items_with_prefix(val, prefix_list)
if with_prefix: #So there is at least 1 item in the list with prefix
sequence_list.extend(with_prefix[:-1])
sequence_list.extend(without_prefix)
else: #there are no items with a prefix in the list
sequence_list.extend(without_prefix[:-1])
输出:
print(sequence_list)
['HUYUII.1', 'JUUIIL.2', 'JUUIIL.3', 'YP_9000.1', 'HUU3222.1', 'ORLOP.8']