У меня есть файл 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']}






Вы можете использовать сочетание сортировки и группировки:
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))
Привет, полезно также включить ваш результат, а не просто описать его. Людям становится немного легче выявлять проблемы, а также помогает убедиться, что они могут воспроизвести то, что вы видите, прежде чем пытаться это исправить.