Обновление словаря в циклах

#python #loops #dictionary

Вопрос:

У меня есть список словарей, в которых ключами являются «имена групп», а значениями-списки генов.

Я хочу обновить каждый словарь новым списком генов, просматривая список спецификаций.

Вот мой псевдокод:

 groups=["group1", "group2"] species_list=["spA", "spB"]   def get_genes(group,sp)  return gene_list  for sp in species_list:  for group in groups:  gene_list[group]=get_genes(group,sp)  gene_list.update(get_genes(group,sp))  

Проблема с этим кодом заключается в том, что новые гены заменяются/перезаписываются предыдущими, а не добавляются в словарь. Мой вопрос в том, где я должен поместить следующую строку. Хотя я не уверен, что это единственная проблема.

 gene_list.update(get_genes(group,sp))  

Данные, которые у меня есть, выглядят так: фрейм данных:

 data={"group1":["geneA1", "geneA2"],  "group2":[ "geneB1","geneB2"]} pd.DataFrame.from_dict(data).T  

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

 data={"group1":["geneA1", "geneA2", "geneX"],  "group2":[ "geneB1","geneB2", "geneX"]} pd.DataFrame.from_dict(data).T  

Таким образом, в данном случае «gene_x» относится к новым генам, полученным функцией get_genes для каждого вида и, наконец, обновленным в существующем словаре.

Любая помощь будет очень признательна!!

Ответ №1:

Вам нужно добавить в список в словарной статье, а не назначать его.

Используется setdefault() для предоставления пустого списка по умолчанию, если ключ словаря еще не существует.

 for sp in species_list:  for group in groups:  gene_list.setdefault(group, []).extend(get_genes(group, sp))  

Комментарии:

1. Хорошо, хорошо, теперь это решило проблему, но создало еще одну.

2. spA=[«geneA1», «geneA2»] spB=[«geneB1″,»geneB2» ] b={‘group1’: [ spA ], «group2»: [ spB] } pd.Фрейм данных(b) a={‘group1’: spA , «group2»: spB} pd.Фрейм данных(a)

3. Я не понимаю, что вы пытаетесь там показать.

4. Так что теперь мой фрейм данных выглядит как. Но я хочу, чтобы все было как у Б.

5. Вы спросили, как обновить словари, как вы показали. Мой код должен это сделать. Если вы не получаете желаемый кадр данных из этого, это другая проблема.

Ответ №2:

Насколько я понимаю, вы хотите добавить новый ген к каждому ключу, чтобы сделать это:

 new_gene = "gene_x" data={"group1":["geneA1", "geneA2"], "group2":[ "geneB1","geneB2"]}  for value in data.values():  value.append(new_gene)   print(data)  

Вы также можете использовать defaultdict, где вы можете добавлять напрямую (для этого прочитайте документы).

Комментарии:

1. Что есть groups в этом ответе?