Как я могу разделить 2D-массив на массив с уникальными значениями и словарем? - PullRequest
1 голос
/ 28 июля 2011

Я пытаюсь разбить 2D-массив на определенный формат и не могу понять последний шаг. Пример моих данных структурирован следующим образом:

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

4 голосов
/ 28 июля 2011

С помощью itertools.group, этот процесс будет намного проще:

>>> 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})]

Но я думаю, что использование 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}}
2 голосов
/ 28 июля 2011

Вы перепутали списки и диктонары.

Было бы гораздо разумнее сделать что-то похожее на это:

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)
1 голос
/ 28 июля 2011
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...