Python zip() 函数

描述

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

语法

zip 语法:

zip([iterable, ...])

参数说明:

  • iterable -- 一个或多个迭代器;

返回值

返回元组列表。

实例

以下两个实例分别展示了 Python2.x 与 Python3.x zip 的使用方法:

实例(Python 2.0+)

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

实例(Python 3.0+)

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]

>>> a1, a2 = zip(*zip(a,b))          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>

工作中使用zip()函数

def mutation_drug_and_no_drug(self):
    df = self.new_gene_mutation_class_df(gene_class='').copy()
    df['mutationtype_ch'] = df['mutationtype_ch'].fillna('--')

    have_drug = []
    no_drug = []
    for by, group in df.groupby(['genesymbol', 'exonintron', 'mutationtype_ch', 'chgvs', 'phgvs', 'vaf']):
        # 本癌种
        current_mut = group[group['current_tumor']]
        # 非本癌种
        no_current_mut = group[~group['current_tumor']]

        # 本癌种敏感
        current_sensitive = current_mut[current_mut['drugefficacy'] == '敏感']
        # 本癌种耐药
        current_negative = current_mut[current_mut['drugefficacy'] == '耐药']

        # 本癌种可能敏感
        current_maybe_sen = current_mut[
            (current_mut['drugefficacy'] == '可能敏感')
            & (current_mut['level_grade1'].isin(['Level B', 'Level C', 'Level D']))
            & (current_mut['Evidence_level'] != 'preclinical')
        ]

        # 非本癌种敏感
        no_current_sen = no_current_mut[
            (no_current_mut['drugefficacy'] == '敏感')
            & (no_current_mut['Evidence_level'].isin(['FDA', 'NMPA', 'NCCN', 'CSCO']))
        ]
        maybe_benefit = pd.concat([current_maybe_sen, no_current_sen])  # 潜在获益的药物

        # 添加'level_grade_new'列
        current_sensitive['level_grade_new'] = current_sensitive['level_grade1'].apply(lambda x: x.split()[-1])
        current_negative['level_grade_new'] = current_negative['level_grade1'].apply(lambda x: x.split()[-1])
        maybe_benefit['level_grade_new'] = maybe_benefit['level_grade1'].apply(lambda x: x.split()[-1])

        current_sensitive_list = [f"{drug_ch} ({level.split()[-1]})" for drug_ch, level in zip(current_sensitive['drug_ch'], current_sensitive['level_grade1'])]
        current_negative_list = [f"{drug_ch} ({level.split()[-1]})" for drug_ch, level in zip(current_negative['drug_ch'], current_negative['level_grade1'])]
        maybe_benefit_list = [f"{drug_ch} ({level.split()[-1]})" for drug_ch, level in zip(maybe_benefit['drug_ch'], maybe_benefit['level_grade1'])]
        
        # 使用chinese_multi_sort()函数排序
        current_sensitive_list = chinese_multi_sort(current_sensitive_list, key=['level_grade_new'], chinese_first=True)
        current_negative_list = chinese_multi_sort(current_negative_list, key=['level_grade_new'], chinese_first=True)
        maybe_benefit_list = chinese_multi_sort(maybe_benefit_list, key=['level_grade_new'], chinese_first=True)

        current_sensitive_list = [i['level_grade_new'] for i in current_sensitive_list]
        current_negative_list = [i['level_grade_new'] for i in current_negative_list]
        maybe_benefit_list = [i['level_grade_new'] for i in maybe_benefit_list]

        maybe_benefit_list = list(set(maybe_benefit_list) - set(current_sensitive_list))
        maybe_benefit_list = [{'drug_ch': drug_ch} for drug_ch in maybe_benefit_list]
        maybe_benefit_list = chinese_multi_sort(maybe_benefit_list, key=['drug_ch'], chinese_first=True)
        maybe_benefit_list = [i['drug_ch'] for i in maybe_benefit_list]

        if all([current_sensitive.empty, current_negative.empty, maybe_benefit.empty]):
            no_drug_group = group[(group['somger'] == 'SOM') & ((group['mtype'] == 'snv') | (group['mtype'] == 'skipping'))]
            if not no_drug_group.empty:
                for index, row in no_drug_group.iterrows():
                    exonintron_sort_exon = 0
                    exonintron_sort_intron = 0

                    if 'exon' in row['exonintron']:
                        exonintron_sort_exon = int(row['exonintron'].split('exon')[-1])
                    elif 'intron' in row['exonintron']:
                        exonintron_sort_intron = int(row['exonintron'].split('intron')[-1])

                no_drug.append({
                    'genesymbol': row['genesymbol'],
                    'exonintron': row['exonintron'],
                    'mutationtype_ch': row['mutationtype_ch'],
                    'chgvs': row['chgvs'],
                    'phgvs': row['phgvs'],
                    'vaf': row['vaf'],
                    'exonintron_sort_exon': exonintron_sort_exon,
                    'exonintron_sort_intron': exonintron_sort_intron
                })
                no_drug = chinese_multi_sort(
                    no_drug,
                    key=['genesymbol', 'exonintron_sort_exon', 'exonintron_sort_intron'],
                    chinese_first=True
                )
        else:
            mut = {
                'genesymbol': by[0],
                'fix_mutation': group['fix_mutation'].values[0] if len(group['fix_mutation'].values) else '',
                'current_sensitive': '\n'.join(current_sensitive_list) if current_sensitive_list else '无',
                'current_negative': '\n'.join(current_negative_list) if current_negative_list else '无',
                'maybe_benefit': '\n'.join(maybe_benefit_list) if maybe_benefit_list else '无',
            }
            have_drug.append(mut)
    return have_drug, no_drug

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ゆきな

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值