如何将二维数组分割为包含唯一值的数组和字典?
我正在尝试把一个二维数组分割成特定的格式,但最后一步有点搞不定。我的数据样本结构如下:
# 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}}