嘿朋友们,我看到了一些奇怪的代码。我是python编程的新手。代码是
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)
我们可以看到上面的列表分为两部分,由'探针','Gene.symbol','Gene.Title','GO1','GO2','GO3'和'探针'分隔, 'Gene.symbol'。
第一部分和第二部分的正则表达式是:
([\w\d]+)_(\w\w)_(\d\d)\.(\w\w)
rg1 rg2 rg3 rg4
哪个匹配字符串,例如ADX_SP_06.ip
或K3SPG_LN_06.id
我的问题是..我没有理解在代码中使用first_part_dict[key].append(i)
。我知道我在这里作为索引。在正则表达式中我不是很好,我认为匹配的部分是数字。所以键将作为一个数字,first_part_dict是一个字典。索引的值i存储在字典first_part_dict ?? ..
我真的很困惑..请帮助我解决这个问题。任何帮助都会受到赞赏..对不起这个长期的问题..
答案 0 :(得分:0)
正在使用的字典是一个字典,其中包含文本/字符串键和列表作为值。
first_part_dict[key].append(i)
正在做的是将i
的值附加(或添加)到与字典key
的键first_part_dict
对应的列表中。
如果密钥为ADX06
,那么如果{'ADX06': []}
的值为1,字典将从{'ADX06': [1]}
转到i
。
我将进行一次演练,以说明:
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 = 0
和string = 'Probes'
。由于Probes
与正则表达式不匹配,因此循环会跳过continue
的下一个项目。
这一次,您获得了i = 1
和string = 'Gene.symbol
。再一次,字符串与正则表达式不匹配,因此您跳到下一个项目。这一直持续到你得到第7项:ADX_KD_06.ip
。在这里,您有i = 6
和string = 'ADX_KD_06.ip'
与正则表达式匹配。
由此,您获得rg1 = ADX
,rg2 = LG
,rg3 = 06
和rg4 = ip
。因此,密钥变为ADX06
,您将first_part_dict[key].append(i)
执行。
这将在字典ADX06
中创建密钥first_part_dict
,并将6
附加到其值列表中。现在,你的词典有{'ADX06': [6]}
。然后循环继续下一个项目。
这一次,我们有i = 7
和string = 'ADX_KD_24.ip'
。这与后面的正则表达式和几行匹配,执行first_part_dict[key].append(i)
。
这将在字典ADX24
中创建密钥first_part_dict
,并将7
附加到其值列表中。现在,你的词典有{'ADX06': [6], 'ADX24': [7]}
。然后循环继续下一个项目。
这一次,我们有i = 8
和string = 'ADX_LG_06.ip'
。这与之后的正则表达式和几行匹配,您再次执行first_part_dict[key].append(i)
。
这将在字典中创建密钥ADX06
...但是等等!该密钥已存在,因此它会将8
附加到其现有值列表中。现在,你的词典有{'ADX06': [6, 8], 'ADX24': [7]}
。
这一直持续到列表中的所有项目都被处理完毕。
答案 1 :(得分:0)
我将专注于
我的问题是..我没理解使用first_part_dict [key] .append(i) 在代码中。我知道我在这里作为索引。在正则表达式中不太好,我认为匹配的部分是数字。所以键将作为数字,first_part_dict是字典。是索引的值我被存储到字典first_part_dict ?? ..
似乎基于某些条件将填充first_part_dict或second_part_dict。 例如。 {'ADX06':[]},下一次迭代 - &gt; {'ADX06':[1,]}。之后的一个小时 - &gt; {'ADX06':[1,4,]}
P.S&GT;我希望你用[]为所有潜在的键初始化first_part_dict [key],或者只是在你去的时候添加first_part_dict [key] = []。