2015-08-24 2 views
-1

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

my_dict = defaultdict(list) 
my_dict[seq].append(read_seq) 

Словарь тогда выглядит примерно так:

{'TTTT': ['AGTG', 'AGGG'], 'AAAA': ['AGAG', 'TGTG']}) 

Моя проблема заключается в том, что я хотел бы связать две отдельные строки с каждым ключом, но добавить их только на добавление нового ключа, а затем никогда больше. И они должны отличаться от значения, указанные выше:

Так что я что-то подобные себе, спасибо:

{'TTTT': ['AGTG', 'AGGG'], ['string1'], ['string2'], 'AAAA': ['AGAG', 'TGTG'], ['string3'], ['string4']}) 
+1

'{'TTTT': ['AGTG', 'AGGG'], ['string1'], ...' first element - пара ключ: значение, вторая - нормальная строка. У вас не может быть словарь с некоторыми элементами в виде kay: пары и некоторые как обычные строки (значения без ключей). Подумайте о структуре, в которой вы хотите снова ввести свои данные. возможно, используйте словарь и список отдельно. –

+3

Прежде всего, ваш ожидаемый результат не является допустимым словарем python. Во-вторых, вы должны объяснить, как вы получаете ожидаемый словарь с примерами –

+0

Я полагал, что это не так. Я могу попробовать и уточнить, но мне интересно узнать, есть ли способ связать несколько частей данных с помощью одного ключа. –

ответ

2

Как насчет проведения кортежа или Dict в качестве значения основного Dict?
Таким образом, вместо этого (что не может вполне существовать в Python):

{'TTTT': ['AGTG', 'AGGG'], ['string1'], ['string2'], 'AAAA': ['AGAG', 'TGTG'], ['string3'], ['string4']}) 

Вы получите:

{'TTTT': (['AGTG', 'AGGG'], ['string1'], ['string2']), 'AAAA': (['AGAG', 'TGTG'], ['string3'], ['string4'])} 

В основном это означает, что кортеж из 3-х элементов для каждого ключа, то первый из них вашего список, а второй и третий - ваши строки.
Для реализации этого, определить ваш defaultdict таким образом:

my_dict = defaultdict(lambda:([], [], [])) 

Затем использовать my_dict[0] для исходного списка строк, my_dict[1] и my_dict[2] для ваших строк.

Пример для добавления ключа/значение этого Dict:

my_dict[seq][0].append(read_seq) 
#And now your two strings: 
my_dict[seq][1] = 'string1' 
my_dict[seq][1] = 'string2' 

Если вы не хотите, чтобы держать ваши строки в списке (который вы, вероятно, не должны), вы можете использовать Dict instead.Then это будет выглядеть следующим образом:

{'TTTT': {'sequences':['AGTG', 'AGGG'], 'additional':('string1', 'string2')}, 'AAAA': {'sequences':['AGAG', 'TGTG'], 'additional':('string3', 'string4')}} 

Это позволит добавлять ключ/значение несколько яснее:

my_dict = defaultdict(dict) 
#... 
my_dict[seq]['sequences'] = read_seq 
#And now your two strings: 
my_dict[seq]['additional'] = ('string1','string2') 

Я лично предпочитаю второй вариант.

+0

Это выглядит великолепно. Но как добавить данные к каждому ключу? –

+0

@ TheNightman Только что добавил примеры. –

+0

Удержание строк в списке делает именно то, что я хочу, так что спасибо.Использование dict дает мне следующую ошибку: TypeError: 'индексы списка должны быть целыми числами, а не str' –

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