словарь с двумя ключами и одним значением не дает правильного вывода - PullRequest
0 голосов
/ 11 апреля 2019

формат внутри counts.txt У меня есть counts.txt файлы в 50 папках, каждая из которых связана с одним образцом.У меня есть 2 столбца в counts.txt: один - строка, а другой - число.Я пытаюсь сделать вложенный словарь с ними.Я хочу использовать первый столбец counts.txt и папки в качестве ключа и второй столбец в counts.txt в качестве значения.К сожалению, список моих папок, которые я хочу сделать с ними в цикле, не отвечает и выдает ошибку!

data_ali = {}

samples_name=natsorted(os.listdir(path1))
for i in samples_name:    
    with open(path1+i[0:]+"/counts.txt","rt") as fin:    
        for l in fin.readlines():    
            l=l.strip().split()    
            if l[0][:4]=='ENSG':    
                gene=l[0]    
                data_ali[gene]={}       
                reads=int(l[1])    
                data_ali[gene][samples_name]=reads
print(data_ali)

Я ожидаю, что вывод моей команды будет выглядеть следующим образом:

'ENSG00000120659': {
    'Sample_1-Leish_011_v2': 14,
    'Sample_2-leish_011_v3': 7,
    'Sample_3-leish_012_v2': 6,
    'Sample_4-leish_012_v3': 1,
    'Sample_5-leish_015_v2': 9,
    'Sample_6-leish_015_v3': 3,
    'Sample_7-leish_016_v2': 4,
    'Sample_8-leish_016_v3': 8,
    'Sample_9-leish_017_v2': 8,
    'Sample_10-leish_017_v3': 2,
    'Sample_11-leish_018_v2': 4,
    'Sample_12-leish_018_v3': 4,
    'Sample_13-leish_019_v2': 7,
    'Sample_14-leish_019_v3': 4,
    'Sample_15-leish_021_v2': 12,
    'Sample_16-leish_021_v3': 5,
    'Sample_17-leish_022_v2': 4,
    'Sample_18-leish_022_v3': 2,
    'Sample_19-leish_023_v2': 9,
    'Sample_20-leish_023_v3': 6,
    'Sample_21-leish_024_v2': 22,
    'Sample_22-leish_024_v3': 10,
    'Sample_23-leish026_v2': 9,
    'Sample_24-leish026_v3': 5,
    'Sample_25-leish027_v2': 4,
    'Sample_26-leish027_v3': 1,
    'Sample_27-leish028_v2': 7,
    'Sample_28-leish028_v3': 5,
    'Sample_29-leish032_v2': 8,
    'Sample_30-leish032_v3': 2
}

, но он выдаст мне эту ошибку:

unhashable type: 'list'

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Проблема со следующими строками.

Вы объявили

data_ali[gene]={}

это нормально. Но тогда вы заявили следующее.

data_ali[gene][samples_name]=reads

Исходя из вашего кода, я предполагаю, что samples_name - это список каталогов. Если это так, то вы получите ошибку error: unhashable type: 'list', потому что вы не можете использовать список в качестве ключа для словаря, так как список изменчив (может быть изменен).

Чтобы преодолеть эту ошибку, вы можете использовать кортеж

data_ali[gene][tuple(samples_name)]=reads
0 голосов
/ 12 апреля 2019

Я не уверен, что такое samples_name, но я полагаю, вы хотите создать ключ для каждого образца:

data_ali = {}

samples_name=natsorted(os.listdir(path1))
for i in samples_name:    
    with open(path1+i[0:]+"/counts.txt","rt") as fin:    
        for l in fin.readlines():    
            l=l.strip().split()    
            if l[0][:4]=='ENSG':    
                gene=l[0]    
                data_ali[gene]={}       
                reads=int(l[1]) 
                data_ali[gene][i]=reads
print(data_ali)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...