我需要有关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.3HUYUII.1,然后由于HUYUII.1prefix_list中没有任何前缀,因此我将其放入sequence_list

print(sequence_list):["HUYUII.1"]
第二个键是'ACTGT',其中有3个值:XP_46744.1JUUIIL.2JUUIIL.3,然后由于JUUIIL.2JUUIIL.3prefix_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.1prefix_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']

10-02 21:19