2013-06-24 2 views
0

У меня есть два столбца в файле, который находится в указанном ниже формате:Создание обеих колонн линии как ключ словаря

00:01:02 aa:bb:cc 1 
03:04:05 dd:ee:ff 2 

и так далее ....

Я хочу сделать путем объединения первого и второго столбцов и создания 3-го столбца в качестве значения. Я пытаюсь таким образом. Это единственный частичный код:

maindict = dict() 
lines = inf.readlines() 
ampdu = [x.split() for x in lines] 
ckey = '-'.join([ampdu[0],ampdu[1]]) 
maindict[ckey] = ampdu[2] 

Я столкнулся ошибку «TypeError: unhashable типа:" список». Где я делаю неправильно? Я только что опубликовал вопрос несколько минут назад. Извините, это было так отчаянно, что вышло так скоро, но это была ситуация с срочностью.

ответ

2

Ваш список ampdu - это список списков, поэтому, когда вы используете join, вы пытаетесь присоединиться к первой и второй строкам файла. Попробуйте повторить этот список, чтобы получить каждую строку по отдельности.

for columns in ampdu: 

Также вы можете использовать кортеж вместо соединения, чтобы сделать ключ.

ckey = (columns[0], columns[1]) 
1

Ваш ampdu список списков:

ampdu = [x.split() for x in lines] 

так что ваши ampdu[0] на самом деле первая строка файла, ampdu[1] ваш второй и т.д.

Причина, почему вы получение TypeError: unhashable type: list объясняется тем, что словарь требует, чтобы их ключи были хешируемыми documentation.

Кроме того, как Mark упоминалось, вы могли бы использовать кортеж вместо объединения их в строку, и вы можете воспользоваться распаковка, чтобы сократить свой код на что-то вроде этого:

inf = open("foo.txt", "r") 
maindict = {} 

for line in inf: 
    col1, col2, val = line.split() 
    maindict[(col1, col2)] = val 

Ваш словарь будет выглядеть как:

>> print maindict 
>> {('00:01:02', 'aa:bb:cc'): '1', 
    ('03:04:05', 'dd:ee:ff'): '2'} 

А для доступа к значениям, вы можете использовать maindict [(col1, col2)]

>> maindict[('03:04:05', 'dd:ee:ff')] 
    2 
1

Это проще всего воспользоваться operator.itemgetter возвращающая кортеж, и построить генератор над файлом делает .split() первый, а затем в dict-comp над этим, например:

from operator import itemgetter 

get_key = itemgetter(0, 1) 
with open('yourfile') as fin: 
    rows = (line.split() for line in fin) 
    maindict = {get_key(row):row[2] for row in rows} 

Это также имеет то преимущество, что вы можете повторно -use get_key если потребуется.

0
with open('file') as f: 
    lines = (line.split() for line in f) 
    maindict = dict(('-'.join([line[0], line[1]]), line[2]) for line in lines)