Python - кормить объект списком

1

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

cat file1.txt

['2.02', '-3.88', '15.25']
['4.40', '-2.36', '14.97']
['5.44', '0.34', '7.34']
['5.76', '0.41', '7.60']
['5.35', '0.19', '13.95']

cat file2.txt

['P1']
['P2']
['P3']
['P4']
['P5']

Код

from ast import literal_eval

#combine both files and return a list
def combiner(infile1, infile2):
    with open(infile1) as f1, open(infile2) as f2:
        f1_lists = (literal_eval(line) for line in f1)
        f2_lists = (literal_eval(line) for line in f2)
        for l1, l2 in zip(f1_lists, f2_lists):
            l3 = l1 + l2
            return l3


class Compass:

def __init__(self, coordx, coordy, coordz, positivity):
        self.coordX = coordx
        self.coordY = coordy
        self.coordZ = coordz
        self.posit = posit

def main():
    file1 = "file1.txt"
    file2 = "file2.txt"
    args = combiner(file1, file2)
    c = Compass(*args)
    print c.coordX + ' ' + c.coordY + ' ' + c.coordZ + ' ' + c.posit

if __name__ == '__main__':
    main()

выход

2.02 - 3.88 15.25 P1

Конечно, он выводит только первый список. Как вы будете продолжать кормить, пока список не закончится? Возможно, используя строки из файла file1.txt?

  • 0
    Пожалуйста, приведите пример результата, который вы ищете. Также все в классе должно быть с отступом, чтобы быть частью класса
  • 0
    Причина вашего вывода в том, что вы возвращаетесь из функции, как только вы получаете первое значение с return l3 .
Теги:
object
list
arguments
feed

3 ответа

1
Лучший ответ

Первая проблема заключается в том, что вы возвращаете только первую строку из списка из combiner(). Решение этого состоит в том, чтобы составить список l3, а затем сохранить к нему новые строки и вернуть их после того, как цикл исчерпан.

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

Решив вышеуказанные проблемы, ваш код будет выглядеть так:

from ast import literal_eval

#combine both files and return a list
def combiner(infile1, infile2):
    with open(infile1) as f1, open(infile2) as f2:
        l3 = [] # this is a list for storing all the lines from both files
        f1_lists = (literal_eval(line) for line in f1)
        f2_lists = (literal_eval(line) for line in f2)
        for l1, l2 in zip(f1_lists, f2_lists):
            l3.append(l1 + l2)
        return l3 # Return all the lines from both text files


class Compass:

    def __init__(self, coordx, coordy, coordz, positivity):
            self.coordX = coordx
            self.coordY = coordy
            self.coordZ = coordz
            self.posit = positivity

def main():
    file1 = "file1.txt"
    file2 = "file2.txt"
    args = combiner(file1, file2)
    # You have 5 different Compass coordinates, therefore you need 5 different Compass instances
    # Therefore make a list of Compass instances
    compasslist = [ Compass(args[i][0], args[i][1], args[i][2], args[i][3]) for i in range(len(args))]

    # args[i][0] is coordx of i-th line (file1.txt), args[i][1] is coordy of i-th line (file1.txt),
    # args[i][2] is coordz of i-th line (file1.txt), and args[i][3] is positivity of i-th line (file2.txt)

    # Lets print all the Compass instances
    for i in range(len(args)):
        print compasslist[i].coordX + ' ' + compasslist[i].coordY + ' ' + compasslist[i].coordZ + ' ' + compasslist[i].posit

if __name__ == '__main__':
    main()
  • 0
    идеальный! Ваш дополнительный список примеров был очень практичным. Большое спасибо.
  • 0
    Просто отметьте, проверьте, предложение Alakazam не создает экземпляры большего количества объектов, а скорее использует то же самое внутри цикла for. Какие-то преимущества?
Показать ещё 1 комментарий
1

Вы возвращаете l3 на первой итерации своего цикла, поэтому вы получаете только строку вывода.

from ast import literal_eval

#combine both files and return a list
def combiner(infile1, infile2):
    with open(infile1) as f1, open(infile2) as f2:
        f1_lists = (literal_eval(line) for line in f1)
        f2_lists = (literal_eval(line) for line in f2)

        result = [] # Store the results in a list
        for l1, l2 in zip(f1_lists, f2_lists):
            l3 = l1 + l2
            result.append(l3)
        return result # Return the list


class Compass:

    def __init__(self, coordx, coordy, coordz, positivity):
            self.coordX = coordx
            self.coordY = coordy
            self.coordZ = coordz
            self.posit = positivity

def main():
    file1 = "file1.txt"
    file2 = "file2.txt"
    all_args = combiner(file1, file2)
    for args in all_args: 
        c = Compass(*args)
        print(c.coordX + ' ' + c.coordY + ' ' + c.coordZ + ' ' + c.posit)

if __name__ == '__main__':
    main()
  • 0
    Спасибо, ваше предложение также решает проблему без создания дополнительных объектов.
1
from ast import literal_eval

with open(filename) as infile_1, open(filename2) as infile_2:  #Open Both files
    for a, b in zip(infile_1, infile_2):                       #Read each line in parallel
        val =  literal_eval(a) + literal_eval(b)
        print(", ".join(val))

Выход:

2.02, -3.88, 15.25, P1
4.40, -2.36, 14.97, P2
5.44, 0.34, 7.34, P3
5.76, 0.41, 7.60, P4
5.35, 0.19, 13.95, P5
  • 0
    благодарю вас. Это предложение генерирует огромный список, который нельзя использовать для подачи объекта, так как он принимает только 4 аргумента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню