2016-11-03 2 views
1

Это взяло меня за день проб и ошибок. Я пытаюсь сохранить словарь запросов и их совпадений в поиске. Моя проблема в том, что может быть одно или несколько совпадений. Мое текущее решение:Как динамически добавлять к массиву в dict?

match5[query_site] уже имеет первое совпадение, но если он найдет другое совпадение, он добавит его, используя следующий код.

temp5=[] #temporary variable to create array    
if isinstance(match5[query_site],list): #check if already a list    
    temp5.extend(match5[query_site]) 
    temp5.append(match_site) 
else: 
    temp5.append(match5[query_site]) 
match5[query_site]=temp5 #add new location 

Эта инструкция if в буквальном смысле предотвращает преобразование моего элемента str в массив букв. Если я попытаюсь инициализировать первое совпадение как один массив элементов, я получаю None, если попытаюсь напрямую добавить. Я чувствую, что для достижения этого должен быть более питонический метод без временной переменной и условного утверждения.

Update: Вот пример моего выхода, когда он работает

 
5'flank: ['8_73793824', '6_133347883', '4_167491131', '18_535703', '14_48370386'] 
3'flank: X_11731384 

Там в 5 матчей за мой «5'flank» и только 1 матч за мой «3'flank».

+1

Что такое 'match_site'? – jojo

+0

Не могли бы вы по умолчанию иметь списки как значения 'match5'? то вы можете просто добавить, если 'match_site' еще нет в списке. Или даже лучше сделайте значения 'set' и используйте' add'. Или, может быть, я не получаю то, что вы хотите ... – jojo

+0

'match_site' - это просто строка – nchuang

ответ

1

Так что по этому поводу:

if query_site not in match5: # here for the first time 
    match5[query_site] = [match_site] 
elif isinstance(match5[query_site], str): # was already here, a single occurrence 
    match5[query_site] = [match5[query_site], match_site] # make it a list of strings 
else: # already a list, so just append 
    match5[query_site].append(match_site) 
+0

технически я пытаюсь добавить 'match_site' не' temp5'. 'temp5' - это только мой временный массив. Я тоже об этом подумал, но он создает список списков с последним элементом как единым элементом. (т. е. '[[[hello],« hi »],« world »],« there »]') – nchuang

+0

@nchuang, поэтому, если вы правильно поняли, вы использовали 'temp5' для переключения на список значений, правильно? Я обновил ответ, если правильно понимаю, что вы хотите сделать, вам вообще не нужно «temp5». – jojo

+0

@nchuang, вы действительно должны сказать нам, как выглядит 'match_site'. Это просто строка или список строк? – jojo

0

Это все, что вам нужно сделать

if query_site not in match5: 
    match5[query_site] = [] 
temp5 = match5[query_site] 
temp5.append(match_site) 

Вы также можете сделать

temp5 = match5.setdefault(query_site, []) 
temp5.append(match_site) 
+0

'temp5' - моя временная переменная. Похоже, вы добавляете к переменной temp? – nchuang

0

Предполагая match5 является словарем, что по этому поводу:

if query_site not in match5: # first match ever 
    match5[query_site] = [match_site] 
else: # entry already there, just append 
    match5[query_site].append(temp5) 

сделать записи о словарь должен быть всегда список и просто приложение конец ему.

+0

Я пробовал что-то вроде этого, но я получаю, что не могу добавить к ошибке str – nchuang

+0

'match5 [query_site]' - это список. Операция 'append' должна работать нормально. Что-то мне не хватает? У вас есть такой пример? – sal

+0

'[match5 [query_site]]' является технически списком, но даже это не работает, если оно не назначено переменной. Мне трудно это продемонстрировать. – nchuang

1

Мне нравится использовать setdefault() для таких случаев.

temp5 = match5.setdefault(query_site, []) 
temp5.append(match_site) 

Это вроде как get() в том, что он возвращает существующее значение, если ключ существует, но вы можете указать значение по умолчанию. Разница в том, что если ключ не существует, то setdefault вставляет значение по умолчанию в dict.

+0

Это даст атрибут AttributeError, который вы пытаетесь вызвать append для объекта str. – nchuang

+0

Если предоставленный мной фрагмент кода всегда используется для обновления 'match5', никогда не будет голой строки, сохраненной как значение в dict. Первый элемент будет сохранен как список с 1 элементом. Так что никаких ошибок. Если 'match5' уже заполнен некоторыми другими данными, код должен быть обобщен для поддержки этого. –

+0

фрагмент кода используется на 'match5 [query_site]' после того, как он знает, что у него уже есть хотя бы один элемент. Да, я видел setdefault как решение для добавления в словарь. Я не понимаю, как это можно обобщить? – nchuang

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