Сделать список в словаре, проиндексированный по метке в списке - PullRequest
0 голосов
/ 07 июня 2018

У меня есть CSV-файл, содержащий сведения о людях, такие как:

1010,Bill,145.98
1147,Gina,10288.97
2917, Willie, 4.97

, и я хочу создать словарь с именем entries, чтобы entries["Gina"] возвращал подсписок [1147,'Gina',10288.97].Моя попытка до сих пор

with open('namesFile.txt', 'r') as f:
    entries = {}
    people = f.readlines()
    people = [person.strip().split(',') for person in people]
    print(people)
    for person in range(len(people)):
        entries[person] = person[1]

дает мне ошибку TypeError: 'int' object is not subscriptable.Он создает хороший вложенный список людей:

[['1010', 'Bill', '145.98'], ['1147', 'Gina', '10288.97'], ['2917', ' Willie', ' 4.97']]

, и я не уверен, как организовать словарь, основанный на имени человека (person[1] в коде), что является предполагаемой цельюпоследние две строки кода.

Как я могу поместить записи в словарь таким способом?

Ответы [ 4 ]

0 голосов
/ 07 июня 2018

Если вы открыты для использования сторонней библиотеки, вы можете использовать pandas:

import pandas as pd

# read file
df = pd.read_csv('file.csv', sep=',', header=None, columns=['x', 'name', 'y'])

# remove whitespace from names
df['name'] = df['name'].str.strip()

# set index to name
df.index = df['name']

# output to file
res.to_csv('file_out.csv', index=False)

# create dictionary from dataframe
res = df.to_dict(orient='index')

print(res)

{'Bill': {'name': 'Bill', 'x': 1010, 'y': 145.98},
 'Gina': {'name': 'Gina', 'x': 1147, 'y': 10288.97},
 'Willie': {'name': 'Willie', 'x': 2917, 'y': 4.97}}

При незначительном изменении вы можете вывести ключ для отображения списка вместо ключа к dict.

0 голосов
/ 07 июня 2018

Вы можете использовать csv модуль для чтения файла и перебора записей, чтобы создать словарь следующим образом:

import csv

entries = {}
with open('namesFile.txt', 'r') as infile:
    rows = csv.reader(infile)

    for row in rows:
        name = row[1]
        entries[name] = row

print('entries', entries)

вывод:

{' Willie': ['2917', ' Willie', ' 4.97'], 'Bill': ['1010', 'Bill', '145.98'], 'Gina': ['1147', 'Gina', '10288.97']}

Это то, чтоты хочешь?Дайте мне знать, если я ошибаюсь.

0 голосов
/ 07 июня 2018
entries = {}
with open('namesFile.txt') as f:
    for line in f:
        x, name, y = line.split(',')
        name = name.strip()
        entries[name] = [int(x), name, float(y)]

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

import csv
entries = {}
with open('namesFile.txt') as f:
    for x, name, y in csv.reader(f):
        name = name.strip()
        entries[name] = [int(x), name, float(y)]
0 голосов
/ 07 июня 2018
with open('namesFile.txt', 'r') as f:
    entries = {}
    people = f.readlines()
    people = [person.strip().split(',') for person in people]
    print(people)
    for person in people:
        entries[person] = person[1]

Ошибка в шестой строке.Использование range(len(people)) сделает person индекс итеративного вложенного списка, а не самого вложенного списка.

РЕДАКТИРОВАТЬ: прочитать комментарий Криса.Я согласен, третья и четвертая строки потенциально могут занять много времени.Вместо этого используйте readline для чтения построчно и записи в словарь по одной строке за раз (вместо всех сразу из списка people).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...