Хобрук: Ваш путь к мастерству в программировании

Создание текстового файла с использованием ключей из словаря с несколькими значениями

Я работаю над сбором информации для этого словаря:

{'Uranus': ['2750', '3000', '2880'],
'Mercury': ['46', '70', '57'],
'Earth': ['147', '152', '150'],
'Venus': ['107', '109', '108'],
'Mars': ['205', '249', '228'],
'Saturn': ['1350', '1510', '1430'],
'Jupiter': ['741', '817', '779'],
'Neptune': ['4450', '4550', '4500'],
'Pluto': ['4440', '7380', '5910']}

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

Uranus,2750,3000,2880
Mercury,46,70,57
Earth,147,152,150
etc

Текущий код

with open(OUTPUT_FILE, "w") as s:
     for key in sol:
         cap_every_other(key)
         combined = [key, sol[key[:]]]
         complete = ', '.join(combined)
         s.write(complete + '\n')

Однако при этом список значений отправляет флаг ошибки, поскольку он не является строкой. Как я могу объединить эти ключи и значения, чтобы они соответствовали формату? Спасибо за помощь. Я, должно быть, переписывал эту вещь 50 раз.


  • всегда лучше опубликовать точный вывод и точный сообщение об ошибке 12.05.2020
  • Вы пытаетесь присоединиться к списку, который содержит список. Вместо этого можно использовать combined = [key] + sol[key] для создания единого списка строк. 12.05.2020

Ответы:


1

Вот решение, перебирающее ключи и значения словаря соответственно с использованием встроенного items() вместе с f-strings.

sol = {'Uranus': ['2750', '3000', '2880'],
'Mercury': ['46', '70', '57'],
'Earth': ['147', '152', '150'],
'Venus': ['107', '109', '108'],
'Mars': ['205', '249', '228'],
'Saturn': ['1350', '1510', '1430'],
'Jupiter': ['741', '817', '779'],
'Neptune': ['4450', '4550', '4500'],
'Pluto': ['4440', '7380', '5910']}

with open(OUTPUT_FILE, "w") as s:
    for k, v in sol.items():
        s.write(f"{k},{','.join(v)}\n")
12.05.2020


3

На самом деле вы можете создать вывод с помощью одной строки Python (кроме данных, очевидно), используя генераторы списков(a):

data = {
    "Uranus": ["2750", "3000", "2880"],
    "Mercury": ["46", "70", "57"],
    "Earth": ["147", "152", "150"],
    "Venus": ["107", "109", "108"],
    "Mars": ["205", "249", "228"],
    "Saturn": ["1350", "1510", "1430"],
    "Jupiter": ["741", "817", "779"],
    "Neptune": ["4450", "4550", "4500"],
    "Pluto": ["4440", "7380", "5910"],
}

print("\n".join([f'{planet},{",".join(data[planet])}' for planet in data]))

Разбивая это выражение на части:

  • f'something' — это f-строка Python, в которой переменные и выражения могут быть интерпретированы внутри самой строки — например, f'_{7+4}_' даст вам ''147,152,150'';

  • {planet} в этой f-строке означает именно это, переменную planet (см. ниже, откуда это взялось);

  • {",".join(data[planet])} — это выражение join в этой f-строке, которое берет каждый элемент в списке data[planet] и дает вам строку, разделенную запятыми. Например, выражение ','.join(data['Earth']) даст вам '147,152,150';

  • [... for planet in data] создаст список каждой из перечисленных выше вещей (планеты и их значения), по одной на планету в коллекции data — вот откуда берется переменная planet в приведенных выше нескольких пунктах;

  • наконец, "\n".join(...) — это внешнее выражение join, которое берет все выходные данные планеты (например, Earth,147,152,150) из предыдущей точки и создает строку, в которой они разделены символами новой строки.

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

Uranus,2750,3000,2880
Mercury,46,70,57
Earth,147,152,150
Venus,107,109,108
Mars,205,249,228
Saturn,1350,1510,1430
Jupiter,741,817,779
Neptune,4450,4550,4500
Pluto,4440,7380,5910

Чтобы получить это в выходной файл, а не просто распечатать его, достаточно просто:

with open('outfile.txt', 'w') as new_file:
    print("\n".join([f'{planet},{",".join(data[planet])}' for planet in data]), file=new_file)

(a) Это нормально для небольших коллекций, подобных этой, но вы можете переосмыслить это, если вы храните данные на всех примерно сто миллиардов или около того планет в нашей галактике. Это будет одна большая строка :-)

12.05.2020

4

вы не можете комбинировать строку в списке так, как вы это делаете: либо вы это делаете. Вы можете сделать либо [key] + item, либо [key, *item]

вы можете использовать items() для прямого перебора ключей и значений

 with open(OUTPUT_FILE, "w") as s:
        for key, value in sol.items():
            cap_every_other(key)  # not sure what this line is supposed to do
            complete = ', '.join([key] + value)
            s.write(complete + '\n')
12.05.2020
  • Любопытно, почему вы считаете, что [key, *item] менее эффективен, чем [key] + item? 12.05.2020
  • Возможно, я ошибаюсь, но я думал, что разложение списка на аргументы менее эффективно, но, возможно, вы правы, и это не имеет значения. удалю комментарий, так как у меня нет времени сравнивать байт-коды. 12.05.2020

  • 5

    Используйте pandas и .to_csv()

    import pandas as pd
    
    data = your data from question
    
    # create dataframe
    df = pd.DataFrame.from_dict(data, orient='index')
    
    # save to csv
    df.to_csv('data.csv', sep=',', header=False)
    
    • Кстати, наличие данных в кадре данных облегчит анализ и построение графиков.
    12.05.2020
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..