Создание строки с повторяющейся структурой - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать строку со следующим выводом:

1: (a, b),
2: (b, c), 
3: (c, d), 
4: (d, e), 
5: (e, f), 
...

Где буквы - это числа.

Есть несколько факторов, которые я хотел бы контролировать:

  • начальное значение 'a'

  • количество рядов. Иногда мне нужно 5 строк, иногда 20 +

  • приращение, на которое увеличиваются значения (от a до b и от b до c увеличиваются на ту же величину, но я хотел бы иметь возможность изменить значение приращения позже).

Исходя из предыдущих отзывов, у меня есть следующий код:

final_lst = []
for x in range(2390, 2640, 50):     # start, end, what it counts by 
    final_lst.append([x, x+50])
print(final_lst)

for i in range(1, 5):   # bin ranges 
    print('%s: (%s,%s),'%(i, x*1, (x+50)))

Благодарю за любую помощь!

Ответы [ 4 ]

0 голосов
/ 16 июня 2020

Я не уверен, что полностью понимаю, но, насколько я понимаю, этого должно хватить:

def rows(initial_value=0, nb_rows=5, row_increment=1):
    string = ""
    for index, value in enumerate(range(initial_value, nb_rows * row_increment, row_increment)):
        string += f"{index}: {(value, value + row_increment)},\n"
    return string

Затем вы можете вызвать это и передать любой параметр, который вам нужен:

>>> print(rows(nb_rows=3))
0: (0, 1),
1: (1, 2),
2: (2, 3),

Еще более чистым решением было бы иметь итератор, который генерирует строки, а затем просто «объединяет» эти строки вместе:

def rows(initial_value=0, nb_rows=5, row_increment=1):
    for index, value in enumerate(range(initial_value, nb_rows * row_increment, row_increment)):
        yield f"{index}: {(value, value + row_increment)}"

Тогда:

>>> print(',\n'.join(rows(nb_rows=3)))
0: (0, 1),
1: (1, 2),
2: (2, 3)
0 голосов
/ 16 июня 2020

Несколько заметок перед тем, как ответить на ваш вопрос.

  1. Поскольку вы хотите иметь возможность изменять пару параметров (начало, количество строк, приращение), это хорошая задача для кадрирования как функции который принимает эти параметры в качестве входных данных.
  2. Вы используете старый метод форматирования строк для express чисел в виде строк. Обычно это не одобряется, и вместо этого вам следует использовать новый формат: "string {} {}".format(value,value2), который автоматически помещает value в первый набор фигурных скобок и value2 во второй, заботясь о форматировании более лаконично и чисто.

    def create_list(start,n_iterations,increment):
        output = [] # to store final list
    
        # if only one argument is given in range, automatically starts range at 0 and increments by 1
        for i in range(n_iterations): 
            val1 = start + i*increment
            val2 = start + (i+1)*increment
            row = "{}: ({},{}),".format(i,val1,val2)
            output.append(row)
    
        #return completed list
        return output
    
    
    
    
    
    #call function
    my_list = create_list(0,10,100)
    
    # print list
    for row in my_list:
        print(row)
    
0 голосов
/ 16 июня 2020

Вы можете использовать однострочник для построения строки (очевидно, не очень читаемой)

a = 10  # starting value
inc = 5  # increment
rows = 5 

s = ",\n".join("{}: ({}, {})".format(i+1, a+i*inc, a+(i+1)*inc) for i in range(rows))

print(s)
0 голосов
/ 16 июня 2020

У вас есть три параметра:

  1. Количество строк N
  2. Начальный номер START
  3. Размер интервала DELTA

Вы можете в основном использовать код, который у вас есть сейчас, но с заменой определенных значений вашими параметрами.

from itertools import islice, count


START = 2390
DELTA = 50
N = 5

for i, x in islice(enumerate(count(START, DELTA), start=1), N):
   print(f'{i}: ({x}, {x + DELTA})')
  • count(START, DELTA) производит бесконечную последовательность значений START, START + DELTA, START + 2*DELTA, ...
  • enumerate объединяет каждый элемент в пары с номером 1, 2, 3 и т.д. c.
  • islice дает только первый N элементы аргумента итератора

В идеале вам не нужно повторять использование DELTA в двух местах. Вы можете использовать itertools.tee и zip, но я не думаю, что это заметное улучшение. Не существует "встроенного" способа продвинуть stop, чтобы подготовить его к архивированию с помощью start.

start, stop = tee(count(START, DELTA))
next(stop)

for i, (x, y) in islice(enumerate(zip(start, stop), start=1), N):
    print(f'{i}: ({x}, {y})')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...