描述
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