#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
в этом ответе?