python中的关键混乱

时间:2014-04-06 14:16:42

标签: python regex

嘿朋友们,我看到了一些奇怪的代码。我是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.ipK3SPG_LN_06.id

我的问题是..我没有理解在代码中使用first_part_dict[key].append(i) 。我知道我在这里作为索引。在正则表达式中我不是很好,我认为匹配的部分是数字。所以键将作为一个数字,first_part_dict是一个字典。索引的值i存储在字典first_part_dict ?? ..

我真的很困惑..请帮助我解决这个问题。任何帮助都会受到赞赏..对不起这个长期的问题..

2 个答案:

答案 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 = 0string = 'Probes'。由于Probes与正则表达式不匹配,因此循环会跳过continue的下一个项目。

这一次,您获得了i = 1string = 'Gene.symbol。再一次,字符串与正则表达式不匹配,因此您跳到下一个项目。这一直持续到你得到第7项:ADX_KD_06.ip。在这里,您有i = 6string = 'ADX_KD_06.ip'与正则表达式匹配。

由此,您获得rg1 = ADXrg2 = LGrg3 = 06rg4 = ip。因此,密钥变为ADX06,您将first_part_dict[key].append(i)执行。

这将在字典ADX06中创建密钥first_part_dict,并将6附加到其值列表中。现在,你的词典有{'ADX06': [6]}。然后循环继续下一个项目。

这一次,我们有i = 7string = 'ADX_KD_24.ip'。这与后面的正则表达式和几行匹配,执行first_part_dict[key].append(i)

这将在字典ADX24中创建密钥first_part_dict,并将7附加到其值列表中。现在,你的词典有{'ADX06': [6], 'ADX24': [7]}。然后循环继续下一个项目。

这一次,我们有i = 8string = '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] = []。