Как мне объединить одинаковые ключи словаря в один?

У меня есть файл csv, который выглядит примерно так:

apple   12   yes
apple   15   no
apple   19   yes

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

{'apple': [[12, 'yes'],[15, 'no'],[19, 'yes']]}

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

import csv
fp = open('fruits.csv', 'r')
reader = csv.reader(fp)
next(reader,None)
D = {}
for row in reader:
    D = {row[0]:[row[1],row[2]]}
    print(D)

Мой вывод выглядит так:

{'apple': [12,'yes']}
{'apple': [15,'no']}
{'apple': [19,'yes']}

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

baileythegreen 04.04.2022 16:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
46
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать сочетание сортировки и группировки:

from itertools import groupby
from operator import itemgetter

_input = """apple   12   yes
apple   15   no
apple   19   yes
"""
entries = [l.split() for l in _input.splitlines()]
{key : [values[1:] for values in grp] for key, grp in groupby( sorted(entries, key=itemgetter(0)), key=itemgetter(0))}

Сортировка применяется до groupby, чтобы не было дубликатов ключей, и ключ обоих берет первый элемент каждой строки.

Ответ принят как подходящий

Ваша проблема в том, что вы сбрасываете D на каждой итерации. Не делай этого.

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

{'apple': [19,'yes']}

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

import csv
fp = open('fruits.csv', 'r')
reader = csv.reader(fp)
next(reader,None)
D = {}
for row in reader:
    if row[0] not in D: # if the key doesn't already exist in D, add an empty list
        D[row[0]] = []
    D[row[0]].append([row[1:]]) # append the rest of this row to the list in the dictionary

print(D) # print the dictionary AFTER you finish creating it

В качестве альтернативы определите D как collections.defaultdict(list), и вы можете пропустить весь блок if

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

Часть проблемы, с которой вы сталкиваетесь, заключается в том, что вместо того, чтобы «добавлять» данные в D[key] через добавление, вы просто заменяете их. В конце концов вы получите только последний результат для каждого ключа.

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

data = [
    ["apple", 12, "yes"],
    ["apple", 15, "no"],
    ["apple", 19, "yes"]
]

result = {}
for item in data:
    result.setdefault(item[0], []).append(item[1:])
print(result)

Это должно дать вам:

{
    'apple': [
        [12, 'yes'],
        [15, 'no'],
        [19, 'yes']
    ]
}

Если вам интересно посмотреть на defaultdict(), решение, основанное на нем, может выглядеть так:

import collections

data = [
    ["apple", 12, "yes"],
    ["apple", 15, "no"],
    ["apple", 19, "yes"]
]

result = collections.defaultdict(list)
for item in data:
    result[item[0]].append(item[1:])
print(dict(result))

Другие вопросы по теме