Мне нужна помощь в добавлении значений в текстовом файле в набор кортежей - PullRequest
0 голосов
/ 04 ноября 2019

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

1.0 5.0
2.0 8.0
3.5 12.5

Мне нужно взять эти значения и сделать их кортежами в наборе, мой вывод должен быть:

[(1.0, 5.0), (2.0, 8.0), (3.5, 12.5)]

Застряло том, как это сделать, простой Python, только если это возможно.

Это мой код до сих пор:

import sys
def read_points(filename: str) -> Set[Tuple[float, float]]:

    file = open(filename)
    lines = file.readlines()
    lines = [item.strip("\n") for item in lines]
    newList = set()
    for item in lines:
            item = item.split(" ")
            item = tuple(float(items) for items in item)
            newList.update(item)                
    file.close()
    print (newList) 

Я продолжаю получать объект 'NoneType' не повторяется, и я незнаю, почему любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

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

newList.add(item)
1 голос
/ 04 ноября 2019

В трассировке стека ошибки всегда указывается, в какой строке произошла ошибка, но по вашему сообщению эта информация необходима для лучшего понимания проблемы, но с учетом предоставленной вами информации я могу сказать, что проблема возниклакогда что-то пыталось выполнить итерацию над None, в этом случае эта операция недопустима, поскольку NoneType не является итеративным.

Эта ситуация может происходить в следующих местах в вашем коде:

lines = [item.strip("\n") for item in lines]

если строк нет N

for item in lines:

если строк нет

item = tuple(float(items) for items in item)

если элемент отсутствует.

Первые две, вам необходимо убедиться, что имя файла указывает нафайл, который существует, иначе readlines () ничего не будет читать

Теперь, для того, что вы пытаетесь достичь, вы идете в правильном направлении. У меня есть несколько собственных вопросов, хотя. Почему newList является набором? Я бы полностью использовал список там для простоты. Я предполагаю, что теперь вы будете использовать список, остальное решение может выглядеть примерно так:

>>> newList = [1.0, 5.0, 2.0, 8.0, 3.5, 12.5]
>>> it = iter(newList)
>>> solution = {(x,y) for x,y in zip(it,it)}
>>> solution
set([(1.0, 5.0), (3.5, 12.5), (2.0, 8.0)])

Надеюсь, это помогло вам.

0 голосов
/ 04 ноября 2019

Причина в том, что вы использовали метод обновления вместо add.
From python docs :

s.update (t) - возвращает set сэлементы, добавленные из t
s.add (x) - добавьте элемент x для установки s

Вы можете легко исправить свой код следующим образом:

import sys
from typing import Tuple, Set


def read_points(filename: str) -> Set[Tuple[float, float]]:

    file = open(filename)
    lines = file.readlines()
    lines = [item.strip("\n") for item in lines]
    newList = set()
    for item in lines:
            item = item.split(" ")
            item = tuple(float(items) for items in item)
            newList.add(item)                 
    file.close()
    print (newList) 
...