如何将二维数组分割为包含唯一值的数组和字典?

1 投票
3 回答
1126 浏览
提问于 2025-04-16 22:24

我正在尝试把一个二维数组分割成特定的格式,但最后一步有点搞不定。我的数据样本结构如下:

# 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']]

我想把它分成这样:

# split into [['Seq3.xls', {'B08524_057':1,'B08524_053':2, 'B08524_054':3},
#             ['Seq98.xls',{'B25034_001':1,'D25034_002':2, 'B25034_003':3}]

字典的键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中的值,让示例更清晰了一些。

3 个回答

1

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者报错。这时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案。

当你在这些论坛上提问时,记得把你的问题描述清楚,包括你遇到的错误信息和你尝试过的解决方法。这样,其他人才能更好地理解你的问题,并给出有效的建议。

同时,查看别人提问和回答的问题也是一个很好的学习方式。你可以从中学到很多实用的知识,帮助你更好地解决自己的编程问题。

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))
2

你把列表和字典搞混了。

这样做会更有意义:

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)

这样会得到:

{'Seq3.xls': ['B08524_052', 'B08524_053', 'B08524_054'], 
'Seq98.xls': ['B25034_001', 'B25034_002', 'B25034_003']}

如果用一个叫做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)
4

使用 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:

>>> [(i, dict((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})]

不过我觉得用字典会更好:

>>> {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}}

撰写回答