如何将二维数组拆分为具有唯一值和字典的数组?

2024-09-24 00:23:44 发布

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

我正在尝试将二维数组拆分为特定格式,但无法确定最后一步。我的数据样本结构如下:

# Original Data
fileListCode = [['Seq3.xls', 'B08524_057'], 
                ['Seq3.xls', 'B08524_053'], 
                ['Seq3.xls', 'B08524_054'],
                ['Seq98.xls', 'B25034_001'], 
                ['Seq98.xls', 'D25034_002'], 
                ['Seq98.xls', 'B25034_003']]

我试着把它分成这样:

^{pr2}$

字典键1、2、3基于条目的原始位置,从文件名第一次出现开始。为此,我首先创建一个数组来获取所有唯一的文件名(任何.xls都是一个文件名)

tmpFileList = []
tmpCodeList = []
arrayListDict = []

# store unique filelist in a tempprary array:
for i in range( len(fileListCode)):
    if fileListCode[i][0] not in tmpFileList:
        tmpFileList.append( fileListCode[i][0]  )

然而,我正在为下一步而奋斗。我想不出一个好的方法来提取代码名(例如B08524_052),并将它们转换成一个字典,其中包含基于它们位置的索引。在

# make array to store filelist, and codes with dictionary values
for i in range( len(tmpFileList)):
    arrayListDict.append([tmpFileList[i], {}])

这段代码只生成[['Seq3.xls', {}], ['Seq98.xls', {}]];我不确定是否应该首先生成结构,然后尝试在中添加代码和字典值,或者是否有更好的方法。在

在-- 编辑:我只是通过改变fileListCode中的值使sample更加清晰


Tags: store代码in字典文件名数组xls结构
3条回答

你把单子和听写搞混了。在

这样做更有意义:

file_list_code = [['Seq3.xls', 'B08524_052'],
                  ['Seq3.xls', 'B08524_053'],                  
                  ['Seq3.xls', 'B08524_054'],                 
                  ['Seq98.xls', 'B25034_001'],                  
                  ['Seq98.xls', 'B25034_002'],                  
                  ['Seq98.xls', 'B25034_003']] 

file_codes = {}
for name, code in file_list_code:
    if name not in file_codes:
        file_codes[name] = []
    file_codes[name].append(code)

这就产生了:

^{pr2}$

这可以通过使用defaultdict进一步简化。对于这么简单的事情,可以说是太过分了,但是知道这一点是很好的。下面是一个例子:

import collections

file_list_code = [['Seq3.xls', 'B08524_052'],
                  ['Seq3.xls', 'B08524_053'],                  
                  ['Seq3.xls', 'B08524_054'],                 
                  ['Seq98.xls', 'B25034_001'],                  
                  ['Seq98.xls', 'B25034_002'],                  
                  ['Seq98.xls', 'B25034_003']] 

file_codes = collections.defaultdict(list)
for name, code in file_list_code:
    file_codes[name].append(code)
fileListCode = [['Seq3.xls', 'B08524_052'],
                ['Seq3.xls', 'B08524_053'],
                ['Seq3.xls', 'B08524_054'],
                ['Seq98.xls', 'B25034_001'],
                ['Seq98.xls', 'B25034_002'],
                ['Seq98.xls', 'B25034_003']]

dico = {}
li = []
for a,b in fileListCode:

    if a in dico:
        li[dico[a]][1][b] = len( li[dico[a]][1] ) + 1


    else:
        dico[a] = len(li)
        li.append([a,{b:1}])


print '\n'.join(map(str,li))

有了,itertools.groupby这个过程将更加简单:

>>> key = operator.itemgetter(0)
>>> grouped = itertools.groupby(sorted(fileListCode, key=key), key=key)
>>> [(i, {k[1]: n for n, k in enumerate(j, 1)}) for i, j in grouped]
[('Seq3.xls', {'B08524_052': 1, 'B08524_053': 2, 'B08524_054': 3}),
 ('Seq98.xls', {'B25034_001': 1, 'B25034_002': 2, 'B25034_003': 3})]

对于旧版Python:

^{pr2}$

但我认为使用dict会更好:

>>> {i: {k[1]: n for n, k in enumerate(j, 1)} for i, j in grouped}
{'Seq3.xls': {'B08524_052': 1, 'B08524_053': 2, 'B08524_054': 3},
 'Seq98.xls': {'B25034_001': 1, 'B25034_002': 2, 'B25034_003': 3}}

相关问题 更多 >