2013-05-25 3 views
3

Я пытаюсь создать файл, который читает дату из файла для дальнейшей обработки, но не может заставить код работать. Я работаю на python и новичок в этом языке. Мои данные файла выглядит следующим образом:Как создать объект типа сложного типа

Name1 L1 11 P27 41 
Name1 L1 13 P27 43 
Name1 L2 85 O60 125 
Name1 L2 07 O60 107 
Name1 L2 68 O60 118 
Name1 L2 17 O60 117 
Name1 L2 92 O60 192 
Name2 L1 04 O60 84 
Name2 L1 19 Z91 139 
Name2 L2 32 Z91 332 

Теперь я хочу, чтобы создать объект Dict как:

{ 
    'Name1':[L1,(11,13),(41,43),P27],[L2,(85,07,68,17,92),(125,107,118,117,192),O60], 
    'Name2':[L1,(19),(139),Z91],[L2,(32),(332),Z91] 
} 
+1

Что такое 'L1' в вашем dict, точно? он записывается как имя переменной, но это не так. Наверное, тебе нужна строка. – Elazar

+2

то, что вы предоставили, не является допустимым 'dict' –

+0

. Да L1 - это данные образца, а не переменная. Я хочу преобразовать данные файла, в основном столбцы в строки, но это слишком выборочно. L1 имеет два столбца, оба из которых преобразуются в строки, подобные (11,13) и (41,43) восприимчиво. но обратите внимание, что данные четвертого столбца не повторяются в строке преобразования. – user2277675

ответ

1

А defaultdict полезен для такого рода проблем, он позволяет добавлять к словарной записи, если запись еще не существует, она будет добавляться в пустой список и помещать его туда вместо того, чтобы бросать исключение как обычно. Вот как я использовал его для обработки ваших данных:

from collections import defaultdict 

d=defaultdict(list) 
with open("input.txt") as data: 
    for line in data: 
     line = line.strip().split() 
     namelist = d[line[0]] 
     try: 
      idx = [x[0] for x in namelist].index(line[1]) 
     except: 
      idx = -1 
     if len(namelist) and idx >= 0: 
      namelist[idx][1].append(line[2]) 
      namelist[idx][2].append(line[4]) 
     else: 
      namelist.append([line[1], [line[2]], [line[4]], line[3]]) 

print d 
>>> defaultdict(<type 'list'>, 
{'Name2': [ 
    ['L1', ['04', '19'], ['84', '139'], 'O60'], 
    ['L2', ['32'], ['332'], 'Z91'] 
], 
'Name1': [ 
    ['L1', ['11', '13'], ['41', '43'], 'P27'], 
    ['L2', ['85', '07', '68', '17', '92'], ['125', '107', '118', '117', '192'], 'O60'] 
]}) 
+0

Есть ли способ найти информацию Name1, L1? В основном, L1 - это тип теста, который говорит Maths, где [11,13] и [42,43] являются термальными метками по попыткам соответственно, а P27 - это классификация тестовой бумаги, такая же сложная, как легкая. Теперь я хочу найти информацию о проверке Name1-> L1 "['L1', ['11', '13'], ['41', '43'], 'P27']". Заранее спасибо! – user2277675

1

Для обработки строк используйте

with open(filename) as file_handle: # open your file 
    for line in file_handle:  # iterate over lines 
     chunks = line.split()  # extract parts of the lines 
     ... 

Теперь chunks будет содержать детали вашей линии.

Вы должны построить dict или даже лучше defaultdict(list) и вставить туда элементы.

+1

'defaultdict (list)' точно не работает прямо из коробки здесь, поскольку OP хочет что-то вроде '[L1, (11,13), (41,43), P27]' – jamylak

+0

Я могу прочитать но при создании преобразования dict я терпеть неудачу. – user2277675

+0

@jamylak: Да, я хотел дать несколько советов довольно полный рабочий код –

1
h=dict() 
with open("input") as ifile: 
    for l in ifile: 
     n,c1,c2,c3,c4=l.split() 
     # now, n=Name1 c1=L1 c2=11 c3=P27 c4=41 
     # create a dict for h['Name1'] if it doesn't exist 
     if n not in h: h[n] = dict() 
     # create a row for h['Name1']['L1'] if it doesn't exist 
     if c1 not in h[n]: h[n][c1] = [ [], [], [] ] 
     # now we have h['Name1]['L1] = [ [], [], [] ] 
     # add items to each column if that item does not exist there 
     if c2 not in h[n][c1][0]: h[n][c1][0].append(c2) 
     if c3 not in h[n][c1][1]: h[n][c1][1].append(c3) 
     if c4 not in h[n][c1][2]: h[n][c1][2].append(c4) 

for hh in h: 
    for hhh in h[hh]: 
     print hh, hhh, h[hh][hhh] 

Выход

Name2 L2 [['32'], ['Z91'], ['332']] 
Name2 L1 [['04', '19'], ['O60', 'Z91'], ['84', '139']] 
Name1 L2 [['85', '07', '68', '17', '92'], ['O60'], ['125', '107', '118', '117', '192']] 
Name1 L1 [['11', '13'], ['P27'], ['41', '43']] 

После этого вы можете заморозить эту структуру в виде некоторого набора, как вам нравится.

+0

Мне не очень жаль, но я не могу следовать вашему ответу. Пожалуйста, добавьте несколько объяснений. – user2277675

+0

@UserSubir, добавлено объяснение надеюсь, что это яснее – perreal

+0

Спасибо! Я также попытаюсь работать над этим решением. вы, ребята, слишком хороши и очень полезны! – user2277675

Смежные вопросы