python中的关键混淆

2024-09-29 19:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,朋友们,我见过一些奇怪的代码。Ampython新手编程代码是

import re, collections

mylist = ['Probes', 'Gene.symbol', 'Gene.Title', 'GO1', 'GO2', 'GO3', 'ADX_KD_06.ip', 'ADX_KD_24.ip', 'ADX_LG_06.ip', 'ADX_LG_24.ip', 'ADX_LV_06.ip', 'ADX_LV_24.ip', 'ADX_SP_06.ip', 'ADX_SP_24.ip', 'ADX_LN_06.id', 'ALM_LN_06.id', 'ALM_LV_06.ip', 'ALM_SP_06.ip', 'K3SPG_LV_06.ip', 'K3SPG_SP_06.ip', 'KKK_LN_06.id', 'KKK_LV_06.ip', 'KKK_SP_06.ip', 'ENDCN_LV_06.in', 'ENDCN_SP_06.in', 'bCD_LV_06.ip', 'bCD_SP_06.ip', 'ADX_LV_06.id', 'ADX_SP_06.id', 'ALM_LV_06.id', 'ALM_SP_06.id', 'D35_LN_06.id', 'K3SPG_LN_06.id', 'K3_LV_06.id', 'K3_SP_06.id', 'bCD_LN_06.id', 'D35_LV_06.id', 'D35_SP_06.id', 'K3SPG_LV_06.id', 'K3SPG_SP_06.id', 'bCD_LV_06.id', 'bCD_SP_06.id', 'ENDCN_KD_06.in', 'ENDCN_LG_06.in', 'Probes', 'Gene.symbol', 'ADX_KD_06.ip', 'ADX_KD_24.ip', 'ADX_LG_06.ip', 'ADX_LG_24.ip', 'ADX_LV_06.ip', 'ADX_LV_24.ip', 'ADX_SP_06.ip', 'ADX_SP_24.ip', 'ADX_LN_06.id', 'ALM_LN_06.id', 'ALM_LV_06.ip', 'ALM_SP_06.ip', 'K3SPG_LV_06.ip', 'K3SPG_SP_06.ip', 'KKK_LN_06.id', 'KKK_LV_06.ip', 'KKK_SP_06.ip', 'ENDCN_LV_06.in', 'ENDCN_SP_06.in', 'bCD_LV_06.ip', 'bCD_SP_06.ip', 'ADX_LV_06.id', 'ADX_SP_06.id', 'ALM_LV_06.id', 'ALM_SP_06.id', 'D35_LN_06.id', 'K3SPG_LN_06.id', 'K3_LV_06.id', 'K3_SP_06.id', 'bCD_LN_06.id', 'D35_LV_06.id', 'D35_SP_06.id', 'K3SPG_LV_06.id', 'K3SPG_SP_06.id', 'bCD_LV_06.id', 'bCD_SP_06.id', 'ENDCN_KD_06.in', 'ENDCN_LG_06.in']

regex = re.compile(r'([\w\d]+)_(\w\w)_(\d\d)\.(\w\w)')

first_part_dict = collections.defaultdict(list)

second_part_dict = collections.defaultdict(list)

“探针”的第二个实例,用于分离第一部分和第二部分

cutoff_index = mylist.index('Probes', 1) 

for i, string in enumerate(mylist):

matched = regex.match(string)

if not matched:

    continue

rg1, rg2, rg3, rg4 = matched.groups()

key = rg1 + rg3

if i < cutoff_index:

    first_part_dict[key].append(i)

else:

    second_part_dict[key].append(i)

我们可以看到上面的列表被分为两部分,由‘Probes’分隔基因符号', '吉恩。头衔'、'GO1'、'GO2'、'GO3'和'Probes'、'基因符号'. 你知道吗

第一部分和第二部分组件的正则表达式是:

([\w\d]+)_(\w\w)_(\d\d)\.(\w\w)
  rg1      rg2     rg3    rg4

它应该匹配这样的字符串ADX_SP_06.ipK3SPG_LN_06.id

我的问题是..我不理解代码中first_part_dict[key].append(i) 的用法。我知道我是作为索引给出的给你。我是正则表达式不太好,我认为匹配的部分是数字。所以呢键将充当一个数字,第一部分是一个数字字典。是吗索引i的值存储到字典的第一部分??。。你知道吗

我真的很困惑..请帮我理解这个..任何帮助将不胜感激..并为这个漫长的问题道歉。。你知道吗


Tags: inipidspkdlnlvlg
2条回答

所使用的字典是一个以文本/字符串键和列表作为值的字典。你知道吗

first_part_dict[key].append(i)所做的是将i的值附加(或添加)到与字典first_part_dict的键key对应的列表中。你知道吗

如果键是ADX06,那么字典将从{'ADX06': []}转到{'ADX06': [1]},如果i的值是1。你知道吗


我将放一个演练来说明:

mylist = ['Probes', 'Gene.symbol', 'Gene.Title', 'GO1', 'GO2', 'GO3', 'ADX_KD_06.ip', 'ADX_KD_24.ip', 'ADX_LG_06.ip'
for i, string in enumerate(mylist):
matched = regex.match(string)
if not matched:
    continue
rg1, rg2, rg3, rg4 = matched.groups()
key = rg1 + rg3
if i < cutoff_index:
    first_part_dict[key].append(i)
else:
    second_part_dict[key].append(i)

当您第一次通过循环时,会得到i = 0string = 'Probes'。由于Probes与regex不匹配,循环将通过continue跳到下一项。你知道吗

这一次,你得到了i = 1string = 'Gene.symbol。同样,字符串与正则表达式不匹配,因此您可以跳到下一项。这个过程一直持续到您得到第7项:ADX_KD_06.ip。这里有i = 6string = 'ADX_KD_06.ip',它们与regex匹配。你知道吗

从中可以得到rg1 = ADXrg2 = LGrg3 = 06rg4 = ip。这样,键就变成了ADX06,您就可以执行first_part_dict[key].append(i)。你知道吗

这将在字典first_part_dict中创建键ADX06,并将6附加到其值列表中。现在,dict有{'ADX06': [6]}。然后循环继续下一项。你知道吗

这一次,我们有i = 7string = 'ADX_KD_24.ip'。这与regex匹配,几行之后,您将执行first_part_dict[key].append(i)。你知道吗

这将在字典first_part_dict中创建键ADX24,并将7附加到其值列表中。现在,dict有{'ADX06': [6], 'ADX24': [7]}。然后循环继续下一项。你知道吗

这一次,我们有i = 8string = 'ADX_LG_06.ip'。这与regex匹配,几行之后,您将再次执行first_part_dict[key].append(i)。你知道吗

这将在字典中创建键ADX06。。。但是等等!该键已经存在,因此它会将8附加到其现有的值列表中。现在,dict有{'ADX06': [6, 8], 'ADX24': [7]}。你知道吗

这会一直持续下去,直到列表中的所有项目都得到处理。你知道吗

我要专注于

My question is that ..I didnt understood the use of first_part_dict[key].append(i) in the code.I know i is given as the index here.Am not so good in regex and i think the matched portion is the number.So the key will act as a number and first_part_dict is a dictionary.Is the value of the index i is stored to the dictionary first_part_dict ??..

似乎基于某些条件,第一部分或第二部分将被填充。 例如{'ADX06':[]},下一次迭代{'ADX06':[1,]}。一段时间后>;{ADX06':[1,4,]}

p.S>;我希望您使用[]为所有可能的密钥初始化first\u part\u dict[key],或者只需在运行时添加first\u part\u dict[key]=[]。你知道吗

相关问题 更多 >

    热门问题